ASP.NET Gridview列没有ID?

ASP.NET Gridview列没有ID?,asp.net,gridview,Asp.net,Gridview,我希望能够使用分配的唯一标识符控制代码隐藏中GridView列的可见性。这样,我就可以动态地决定显示和隐藏哪些列,而不必每次添加新列时都更改代码 我想到的最好的方法是使用列的HeaderText作为唯一标识符,并创建一个函数,在GridView.columns中的所有DataControlField对象上循环,搜索请求的HeaderText 我觉得奇怪的是,DataControlField对象不能有一个像GridView.Columns[“AssignableID”]那样可以访问的可分配ID属性

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

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

我觉得奇怪的是,
DataControlField
对象不能有一个像
GridView.Columns[“AssignableID”]
那样可以访问的可分配ID属性。是否有编程原因导致
DataControlField
不能有这样的ID属性,或者它只是一个碰巧不存在的功能

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

对于每个请求,下面是按HeaderText进行搜索的示例:

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

首先,我和你在一起。我也认为这样的代码

myGridView.Columns[0].Visible = false;
与(伪代码)相比,可读性较差且更容易出错:

因此,您的问题是为什么
DataControlField
中没有
ID
属性是有意义的

正如我已经评论过的:

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


我假设上述情况以及存在不同类型的
DataControlFields
这一事实类似,或者是没有
ID
属性的原因,因为它是不可预测的。其中一些是手动添加的(以声明方式或编程方式),其他可能是自动添加的(例如,
按钮字段,ID将自动生成),一些包含在中,而其他则不包含,依此类推。

ASP.NET网格视图列在代码中没有ID或唯一值可访问

我们可以使用索引或名称

例如:

使用索引:

 if(Grid.Columns[0].Visible == true)  
    Grid.Columns[0].Visible = false;

 if(Grid.Columns[0].Visible == false)  
    Grid.Columns[0].Visible = true;
使用名称:

 if(Grid.Columns["ColumnName"].Visible == true)  
    Grid.Columns["ColumnName"].Visible = false;

 if(Grid.Columns["ColumnName"].Visible == false)  
    Grid.Columns["ColumnName"].Visible = true;

如果把你的问题分成几段,阅读和理解起来会容易一些=)我已经为你做了这件事,但仅供将来参考。回到主题:我假设你知道选择它们的顺序,对吗?如下所示:
myGridView.Columns[0].Visible=false如果您已经发布了示例代码,以查看如何基于HeaderText切换列的可见性(尽管我可以想象)。那会使你的问题不那么抽象。Edit@jadarnel27:但我也认为这样的代码比(pseudo)可读性差,更容易出错:
myGridView.Columns[“UserName”]。Visible=false。更重要的是,当你以后更改列的顺序时。@TimSchmelter我只是想确保OP知道有办法。我完全同意使用“字典式”查找的示例是更可取的方法,数字索引很难维护=)仅供参考:显式声明的列字段可以与自动生成的列字段结合使用。使用这两个字段时,首先呈现显式声明的列字段,然后是自动生成的列字段。自动生成的列字段不会添加到Columns集合中。我想这是有道理的,尽管这仍然令人沮丧。如果有选择的话,我可能会完全放弃使用GridView,因为这些类型的场景都支持自己使用代码创建表。然而,当你采用一个到处使用它们的大型应用程序,而你又没有足够的预算来修复它们时,这并不是一个真正的选择。
 if(Grid.Columns["ColumnName"].Visible == true)  
    Grid.Columns["ColumnName"].Visible = false;

 if(Grid.Columns["ColumnName"].Visible == false)  
    Grid.Columns["ColumnName"].Visible = true;