如何使用自动生成的列隐藏ASP.NET GridView中的列?

cnd*_*cnd 35 asp.net gridview

即使是SqlDataSource1.DataBind(),GridView1.Columns.Count也始终为零;

但网格还可以

我可以

for (int i = 0; i < GridView1.HeaderRow.Cells.Count;i++)
Run Code Online (Sandbox Code Playgroud)

我在这里重命名请求标题但是

GridView1.Columns[i].Visible = false;
Run Code Online (Sandbox Code Playgroud)

由于GridView1.Columns.Count为0,我无法使用它.

那么我怎么能隐藏它们呢?

Jan*_*oom 47

尝试将e.Row.Cells[0].Visible = false;内部RowCreated事件放入网格中.

protected void bla_RowCreated(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[0].Visible = false; // hides the first column
}
Run Code Online (Sandbox Code Playgroud)

这样它就会自动隐藏整个列.

您无法访问grid.Columns[i]gridview的DataBound事件中的生成列.

  • 这听起来不是一个好主意.每次GridView渲染时,都会多次调用RowCreated. (6认同)

Ste*_*ert 11

仅当AutoGenerateColumns = false时才会填充Columns集合,并且您自己手动生成列.

一个很好的解决方法是在设置DataSource属性并调用DataBind()之前自己动态填充Columns集合.

我有一个函数,根据我想要显示的DataTable的内容手动添加列.一旦我完成了(然后设置DataSource并调用了DataBind(),我可以使用Columns集合并且Count值是正确的,并且我可以按照我最初的想法打开和关闭列可见性.

static void AddColumnsToGridView(GridView gv, DataTable table)
{
    foreach (DataColumn column in table.Columns)
    {
        BoundField field = new BoundField();
        field.DataField = column.ColumnName;
        field.HeaderText = column.ColumnName;
        gv.Columns.Add(field);
    }
}
Run Code Online (Sandbox Code Playgroud)


Eil*_*lon 10

注意:此解决方案仅在您的GridView列提前知道时才有效.

听起来你正在使用GridViewwith AutoGenerateColumns=true,这是默认设置.我建议AutoGenerateColumns=false手动设置和添加列:

<asp:GridView runat="server" ID="MyGridView"
    AutoGenerateColumns="false" DataSourceID="MySqlDataSource">
    <Columns>
        <asp:BoundField DataField="Column1" />
        <asp:BoundField DataField="Column2" />
        <asp:BoundField DataField="Column3" />
    </Columns>
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)

并且只包含BoundField要显示的每个字段的a .这将为您提供数据显示方式的最大灵活性.


小智 5

我遇到了同样的问题 - 需要我的GridView控件的AutogenerateColumns为'true',因为它被SQL数据源绑定,因此我需要隐藏一些不能在GridView控件中显示的列.

实现这一目标的方法是在GridView的'_RowDataBound'事件中添加一些代码,例如这个(让我们假设您的GridView的ID是''MyGridView'):

protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Cells[<index_of_cell>].Visible = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

那就行了就好了;-)

  • 4 2 (3认同)