代码改变世界

GridView根据列名取值

2010-02-05 15:26  Jeff Chow  阅读(1383)  评论(0)    收藏  举报

早上看了一些关于GridView隐藏列的文章,才知道GridView有DataKeys这么一个属性。

从名字上看,它是该GridView的键的一个集合。但如果把所有的字段都设为键的话,它也就成了数据集合。

下面的例子实现了根据列名来取值。

 

aspx文件代码:

<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
            <Columns>
                <asp:BoundField DataField="id" Visible="false" />
                <asp:BoundField DataField="department" />
                <asp:BoundField DataField="age" />
                <asp:BoundField DataField="name" />
                <asp:BoundField DataField="salary" />
            </Columns>
        </asp:GridView>
    </div>
    <div>
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </div>
    </form>
</body>

 

aspx.cs文件代码:

protected void Page_Load(object sender, EventArgs e)
{
    //数据源
    DataTable table = getDataTable();

    //数据源列名
    string[] columns = getColumnNames(table);

    //设置DataKeyNames属性
    GridView1.DataKeyNames = columns;

    GridView1.DataSource = table;

    GridView1.DataBind();
    
    int row = new Random().Next(0, 9);
    Label1.Text = GridView1.DataKeys[row]["name"].ToString();
}

/// <summary>
/// 数据源
/// </summary>
/// <returns></returns>
private DataTable getDataTable()
{
    DataTable table = new DataTable("employee");

    table.Columns.Add("id");
    table.Columns.Add("name");
    table.Columns.Add("age");
    table.Columns.Add("department");
    table.Columns.Add("salary");

    for (int i = 0; i < 10; i++)
    {
        DataRow row = table.NewRow();
        row[0] = i.ToString();
        row[1] = "name" + i.ToString();
        row[2] = "age" + i.ToString();
        row[3] = "department" + i.ToString();
        row[4] = "salary" + i.ToString();
        table.Rows.Add(row);
    }
    return table;
}

/// <summary>
/// 列名集合
/// </summary>
/// <param name="table"></param>
/// <returns></returns>
private string[] getColumnNames(DataTable table)
{
    string s = string.Empty;

    foreach (DataColumn c in table.Columns)
    {
        s += c.ColumnName + ",";
    }
    return s.TrimEnd(',').Split(',');
}

 

根据MSDN原文:

当设置了 DataKeyNames 属性时,GridView 控件用来自指定字段的值填充它的 DataKeys 集合,这提供了一种访问每个行的主键的便捷方法。

 

设置了DataKeyNames以后,在绑定数据的时候,GridView会为每一行生成一个DataKey对象。

理论上,做的东西多了,自然速度就会慢点,但我个人确实不喜欢依赖于序号。