How to hide columns in an ASP.NET GridView with auto-generated columns?

前端 未结 12 1666
陌清茗
陌清茗 2020-11-30 08:28

GridView1.Columns.Count is always zero even SqlDataSource1.DataBind();

But Grid is ok

I can do

for (int i = 0; i < GridView1.HeaderRow.Cel         


        
相关标签:
12条回答
  • 2020-11-30 09:02

    In the rowdatabound method for 2nd column

    GridView gv = (sender as GridView);
    gv.HeaderRow.Cells[2].Visible = false;
    e.Row.Cells[2].Visible = false;
    
    0 讨论(0)
  • 2020-11-30 09:02

    @nCdy: index_of_cell should be replaced by an integer, corresponding to the index number of the cell that you wish to hide in the .Cells collection.

    For example, suppose that your GridView presents the following columns:

    CONTACT NAME | CONTACT NUMBER | CUSTOMERID | ADDRESS LINE 1 | POST CODE

    And you want the CUSTOMERID column not to be displayed. Since collections indexes are 0-based, your CUSTOMERID column's index is..........? That's right, 2!! Very good. Now... guess what you should put in there, to replace 'index_of_cell'??

    0 讨论(0)
  • 2020-11-30 09:07

    Note: This solution only works if your GridView columns are known ahead of time.

    It sounds like you're using a GridView with AutoGenerateColumns=true, which is the default. I recommend setting AutoGenerateColumns=false and adding the columns manually:

    <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>
    

    And only include a BoundField for each field that you want to be displayed. This will give you the most flexibility in terms of how the data gets displayed.

    0 讨论(0)
  • 2020-11-30 09:09

    Try this to hide columns in an ASP.NET GridView with auto-generated columns, both RowDataBound/RowCreated work too.

    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
    
    0 讨论(0)
  • 2020-11-30 09:11

    Try putting the e.Row.Cells[0].Visible = false; inside the RowCreated event of your grid.

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

    This way it auto-hides the whole column.

    You don't have access to the generated columns through grid.Columns[i] in your gridview's DataBound event.

    0 讨论(0)
  • 2020-11-30 09:15

    I found Steve Hibbert's response to be very helpful. The problem the OP seemed to be describing is that of an AutoGeneratedColumns on a GridView.

    In this instance you can set which columns will be "visible" and which will be hidden when you bind a data table in the code behind.

    For example: A Gridview is on the page as follows.

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

    And then in the code behind a PopulateGridView routine is called during the page load event.

    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();
    }
    

    In the above the GridView AutoGenerateColumns is set to False and the codebehind is used to create the bound fields. One is obtaining the datasource as a datatable through one's own process which here I labeled GetDataSource(). Then one loops through the columns collection of the datatable. If the column name meets a given criteria, you can set the bound field visible property accordingly. Then you bind the data to the gridview. This is very similar to AutoGenerateColumns="True" but you get to have criteria for the columns. This approach is most useful when the criteria for hiding and un-hiding is based upon the column name.

    0 讨论(0)
提交回复
热议问题