ASP.NET Gridview 列没有 ID?

Dav*_*vid 5 asp.net gridview

我希望能够GridView使用我分配的唯一标识符来控制代码隐藏中列的可见性。这样,我可以动态决定显示和隐藏哪些列,而且每次添加新列时都不必更改代码。

我想到的最好的方法是使用HeaderText列作为唯一标识符,并创建一个函数来循环遍历 中的所有DataControlField对象GridView.Columns,搜索请求的 HeaderText。

尽管DataControlField对象不能具有可以像GridView.Columns["AssignableID"]. 是否存在DataControlField无法以这种方式工作的 ID 属性的编程原因,或者它只是一个不存在的功能?

我的问题更多是关于它为什么不存在的原因,而不是隐藏列问题的实际解决方案,但如果有人有更好的方法来实现这一点,我将不胜感激。

根据请求,以下是按 HeaderText 搜索的示例:

protected DataControlField GetColumn(GridView grid, string columnName)
{
    foreach (DataControlField column in grid.Columns)
    {
        if (column.HeaderText == columnName)
        {
            return column;
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 2

首先,我就在你身边。我也认为这样的代码

myGridView.Columns[0].Visible = false;
Run Code Online (Sandbox Code Playgroud)

与(伪代码)相比,可读性较差且更容易出错:

myGridView.Columns["UserName"].Visible = false;
Run Code Online (Sandbox Code Playgroud)

因此,你的问题为什么没有ID财产是DataControlField有道理的。

正如我已经评论过的:

显式声明的列字段可以与自动生成的列字段结合使用。当两者都使用时,首先呈现显式声明的列字段,然后是自动生成的列字段。自动生成的列字段不会添加到 Columns 集合中

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.columns.aspx

我假设上述事实以及存在不同类型的DataControlFieldslike TemplateFieldBoundField或者ButtonField是没有财产的原因ID,因为它是不可预测的。其中一些是手动添加的(以声明方式或编程方式),其他可能会自动添加(如果是ButtonFields,ID 将自动生成),一些包含在集合中,而另一些则不包含在Columns集合中,等等。