Solved

How to access gridview DataRow field to conditionally set Gridview Header field

Posted on 2011-09-06
2
511 Views
Last Modified: 2013-11-26
I have a gridview.  One of my dataRow fields holds either an "H" or a "D" value to indicate "Hours" or "Days".    I want to display "Hours" or "Days" in the header based on the dataRow field value.

Is there a way to determine the value of the dataRow field when the gridview is processing the Header row?  

 if (e.Row.RowType == DataControlRowType.Header)
            {
                if (e.Row.Cells[2].Text.Contains("H"))  This is the datarow field value I'm trying to access (this doesn't work)

0
Comment
Question by:ppeterso
2 Comments
 
LVL 28

Expert Comment

by:strickdd
ID: 36491146
1. create an OnDataBound event for the gridview.
2. Then, assuming all no row can have an "H" when another row contains a "D", look at the first row
3. If the first row has an "H" change the gridview header row column
4. Do the same if the row has a "D"
0
 
LVL 17

Accepted Solution

by:
Carlos Villegas earned 250 total points
ID: 36491772
Hello, assuming that your GridView DataSource is a DataTable object I did this example for you:
<%@ Import Namespace="System.Data" %>

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    Random rnd = new Random();

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // Default show hours data.
            Button1_Click(this, e);
        }
    }

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        {
            DataTable dtt = GridView1.DataSource as DataTable;
            if (dtt != null && dtt.Rows.Count > 0)
            {
                if (dtt.Rows[0]["ColumnB"].ToString().Equals("H"))
                    e.Row.Cells[0].Text = "Hours";
                else
                    e.Row.Cells[0].Text = "Days";

                return;
            }
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        // Show hours data.
        BindMyData(true);
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        // Show days data.
        BindMyData(false);
    }

    void BindMyData(bool hours)
    {
        DataTable dtt = new DataTable();
        dtt.Columns.Add("ColumnA", typeof(int));
        dtt.Columns.Add("ColumnB", typeof(string));

        for (int i = 0; i < 12; i++)
        {
            dtt.Rows.Add(rnd.Next(1, 120), hours ? "H" : "D");
        }

        GridView1.DataSource = dtt;
        GridView1.DataBind();
    }

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound">
            <Columns>
                <asp:BoundField DataField="ColumnA" />
                <asp:BoundField DataField="ColumnB" />
            </Columns>
        </asp:GridView>
        <asp:Button ID="Button1" runat="server" Text="Show Hours Data" OnClick="Button1_Click" />
        <br />
        <asp:Button ID="Button2" runat="server" Text="Show Days Data" OnClick="Button2_Click" />
        <br />
    </div>
    </form>
</body>
</html>

Open in new window


You can download the full aspx file from this link:
http://dl.dropbox.com/u/13237304/EE/CustomGridView.zip

I hope this helps.
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
Microsoft Active Directory, the widely used IT infrastructure, is known for its high risk of credential theft. The best way to test your Active Directory’s vulnerabilities to pass-the-ticket, pass-the-hash, privilege escalation, and malware attacks …
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

820 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question