C# 设置数据源时如何在gridview中隐藏列

C# 设置数据源时如何在gridview中隐藏列,c#,asp.net,gridview,C#,Asp.net,Gridview,我有以下代码来隐藏列和编辑列标题。但它不会进入foreach。我尝试了各种方法,将foreach放入DataBound、RowDataBound和RowCreated事件中。但不起作用 GridView1.AutoGenerateColumns = true; GridView1.DataSource = SomeObject[]; GridView1.DataBind(); foreach (DataControlField col in GridView1.Columns) { i

我有以下代码来隐藏列和编辑列标题。但它不会进入foreach。我尝试了各种方法,将foreach放入DataBound、RowDataBound和RowCreated事件中。但不起作用

GridView1.AutoGenerateColumns = true;
GridView1.DataSource = SomeObject[];
GridView1.DataBind();

foreach (DataControlField col in GridView1.Columns)
{
    if (col.HeaderText == "FirstName") 
    {
        col.HeaderText = "First Name"; 
    }
    if (col.HeaderText == "SchoolName") 
    { 
        col.Visible = false; 
    }
}

谁能告诉我修理方法吗。谢谢

请注意,如果执行
autoGenerateColumns=true

protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[index].Visible = false;
}
使用GridView的RowDataBound事件将列设置为不可见

在aspx页面上,您可以像这样在gridview控件中声明

<asp:GridView runat="server" OnRowDataBound="GridView_RowDataBound" .../>

试试这个:

int indexOfSchoolName = -1;
int columnIndex = -1;
foreach(TableCell cell in GridView1.HeaderRow.Cells)
{
    columnIndex ++;
    if (cell.Text == "FirstName") 
    { 
        cell.Text = "First Name"; 
    }
    if(cell.Text == "SchoolName") indexOfSchoolName = columnIndex;
} 
if(indexOfSchoolName != -1)
{
    foreach(GridViewRow row in GridView1.Rows)
    {
        row.Cells[indexOfSchoolName].Visible = false;
    }
}

为什么不从SomeObject[]中删除列或克隆它,然后删除列?

如果
SomeObject[]
是一个数组,那么您可能需要尝试复制
SomeObject[]
以表示
CopyObject[]
,并操作此数组以排除所需的列。最后将其重新绑定到网格视图。

我通常会这样做:

private int GetColumnIndexByName(GridView grid, string name)
{
    foreach (DataControlField col in grid.Columns)
    {
        if (col.HeaderText.ToLower().Trim() == name.ToLower().Trim())
        {
            return grid.Columns.IndexOf(col);
        }
    }

    return -1;
}

GridView1.Columns[GetColumnIndexByName(GridView1, "SchoolName")].Visible = false;

这有用吗?不,不想使用硬编码索引。因为我想让它成为未来的证明。如果索引发生变化,则会中断。如果您采用该解决方案并添加该解决方案,如何?不希望在这一点上失去值,@Dusht解决方案似乎是最好的。它使用正确的方法和干净的代码。与我的代码有什么区别?grid.Columns在此没有任何内容。正如@Dusht所指出的,在数据源就位后,您需要将AutoGenerateColumns=true移动到。谢谢Tim,cell.Text在调试时是空字符串