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

时间:2010-01-19 06:04:23

标签: asp.net gridview

GridView1.Columns.Count总是为零,即使是SqlDataSource1.DataBind();

但网格还可以

我能做到

for (int i = 0; i < GridView1.HeaderRow.Cells.Count;i++)

我在这里重命名请求标头 但

GridView1.Columns[i].Visible = false;

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

那我怎么能隐藏它们呢?

12 个答案:

答案 0 :(得分:43)

尝试将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
}

这样它会自动隐藏整个列。

您无法在gridview的grid.Columns[i]活动中通过DataBound访问生成的列。

答案 1 :(得分: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);
    }
}

答案 2 :(得分:10)

注意:此解决方案仅适用于提前知道GridView列的情况。

听起来您使用GridView 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>

并且只为您要显示的每个字段添加BoundField。这将为您提供最灵活的数据显示方式。

答案 3 :(得分:5)

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

实现此目的的方法是在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;
    }
}

那就好了; - )

答案 4 :(得分:3)

尝试使用自动生成的列隐藏ASP.NET GridView中的列,RowDataBound / RowCreated也都可以。

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound

    If e.Row.RowType = DataControlRowType.DataRow Or _
        e.Row.RowType = DataControlRowType.Header Then   // apply to datarow and header 

        e.Row.Cells(e.Row.Cells.Count - 1).Visible = False // last column
        e.Row.Cells(0).Visible = False  // first column

    End If
End Sub

Protected Sub GridView1_RowCreated(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowCreated

    If e.Row.RowType = DataControlRowType.DataRow Or _
        e.Row.RowType = DataControlRowType.Header Then

        e.Row.Cells(e.Row.Cells.Count - 1).Visible = False
        e.Row.Cells(0).Visible = False

    End If
End Sub

答案 5 :(得分:2)

在网格数据绑定后,您必须执行GridView1.Columns[i].Visible = false;

答案 6 :(得分:1)

@nCdy: index_of_cell 应替换为整数,对应于您希望隐藏在.Cells集合中的单元格的索引号。

例如,假设您的GridView显示以下列:

联络姓名|联系号码| CUSTOMERID | ADDRESS LINE 1 |邮政编码

您希望不显示 CUSTOMERID 列。 由于集合索引是从0开始的,因此 CUSTOMERID 列的索引是..........?那是对的,2 !!很好。 现在......猜猜你应该放在那里,替换' index_of_cell '??

答案 7 :(得分:1)

在第二列的rowdatabound方法

GridView gv = (sender as GridView);
gv.HeaderRow.Cells[2].Visible = false;
e.Row.Cells[2].Visible = false;

答案 8 :(得分:0)

正如其他人所说,RowDataBound或RowCreated事件应该可以工作但如果你想避免事件声明并将整个代码放在DataBind函数调用之下,你可以执行以下操作:

GridView1.DataBind()
If GridView1.Rows.Count > 0 Then
    GridView1.HeaderRow.Cells(0).Visible = False
    For i As Integer = 0 To GridView1.Rows.Count - 1
        GridView1.Rows(i).Cells(0).Visible = False
    Next
End If

答案 9 :(得分:0)

我发现Steve Hibbert的回应非常有帮助。 OP似乎描述的问题是GridView上的AutoGeneratedColumns。

在这种情况下,您可以设置哪些列将是&#34;可见&#34;当你在后面的代码中绑定数据表时,它将被隐藏。

例如: Gridview在页面上如下。

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" >
</asp:GridView>

然后在页面加载事件期间调用PopulateGridView例程后面的代码。

protected void PopulateGridView()
{
    DataTable dt = GetDataSource();
    gv.DataSource = dt;
    foreach (DataColumn col in dt.Columns)
    {
        BoundField field = new BoundField();
        field.DataField = col.ColumnName;
        field.HeaderText = col.ColumnName;
        if (col.ColumnName.EndsWith("ID"))
        {
            field.Visible = false;
        }
        gv.Columns.Add(field);
    }
    gv.DataBind();
}

在上面,GridView AutoGenerateColumns设置为False,代码隐藏用于创建绑定字段。一种是通过一个人自己的过程获取数据源作为数据表,在这里我标记为GetDataSource()。然后循环遍历数据表的列集合。如果列名称符合给定条件,则可以相应地设置绑定字段visible属性。然后将数据绑定到gridview。这与AutoGenerateColumns =&#34; True&#34;非常相似但你可以得到列的标准。当隐藏和取消隐藏的标准基于列名称时,此方法最有用。

答案 10 :(得分:0)

与接受的答案类似,但允许使用ColumnNames 并绑定到RowDataBound()。

Dictionary<string, int> _headerIndiciesForAbcGridView = null;

protected void abcGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (_headerIndiciesForAbcGridView == null) // builds once per http request
    {
        int index = 0;
        _headerIndiciesForAbcGridView = ((Table)((GridView)sender).Controls[0]).Rows[0].Cells
            .Cast<TableCell>()
            .ToDictionary(c => c.Text, c => index++);
    }

    e.Row.Cells[_headerIndiciesForAbcGridView["theColumnName"]].Visible = false;
}

不确定它是否适用于RowCreated()。

答案 11 :(得分:0)

遍历GridView行,并使目标列的单元格不可见。在此示例中,我想使第4-6列保持可见,因此我们跳过这些内容:

foreach (GridViewRow row in yourGridView.Rows)
   {
     for (int i = 0; i < rows.Cells.Count; i++)
     {
        switch (i)
        {
           case 4:
           case 5:
           case 6:
              continue;
        }
        row.Cells[i].Visible = false;
     };
   };

然后,您将需要单独删除列标题(请记住,删除标题单元格会在每次删除后更改GridView的长度):

grdReportRole.HeaderRow.Cells.RemoveAt(0);