如何动态地将GridView列设置为可见或不可见?

7
我正在使用如下的asp.net GridView:

    mygrid.DataSource = dTable;       
    mygrid.DataBind();

    if (mygrid.Columns.Count > 1)
    {
        mygrid.Columns[2].Visible = false;
    } 

我的网格视图代码如下:
    <asp:GridView ID="mygrid" runat="server" AllowPaging="True" 
       onpageindexchanging="mygrid_PageIndexChanging" PageSize="15" 
       PersistedSelection="true"  
       ondatabound="mygrid_DataBound">
       <Columns>
           <asp:TemplateField>
           <ItemTemplate>
           <asp:HyperLink ID="Edit" runat="server" Text="Edit" NavigateUrl='<%# Eval("Value", "~/myweppage.aspx?Id=M{0}") %>' />
           </ItemTemplate>
           </asp:TemplateField> 
       </Columns>           
       <PagerSettings PageButtonCount="4" />


   </asp:GridView>

我无法设置visible=false

我尝试了下面这个答案:

如何动态地使多个gridview列不可见?

在Visual Studio 2010中,我找不到datarow事件。有人能帮我设置列的可见属性吗?

我的数据表的列结构是:

column[0]是Value列,然后还有4个其他列。

我的GridView的列结构是:

column[0]是链接字段,column1是来自Dtable的Value field,还有4个其他列。


如果我不将它放在if条件语句中,那么它会报对象引用未设置的错误。如果我将其放在if条件语句中,控制权就无法到达它。 - Raghuveera
你是否在GridView中使用了AutoGenerateColumns="false" - Bhavesh Kachhadiya
@Bhavesh Kachhadiya如果我设置AutoGenerateColumns =“false”属性,则只有一个列是可见的。来自数据表的列不可见。同样的问题,如果列数> 1,则条件失败。 - Raghuveera
我已经编辑了答案,它将完美地为您工作。请查看我的编辑答案。 - Bhavesh Kachhadiya
5个回答

9
这是网格视图中动态生成列的完美解决方案。 请尝试以下操作:
int indexOfColumn = 1; //Note : Index will start with 0 so set this value accordingly
protected void mygrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.Cells.Count > indexOfColumn)
    {
        e.Row.Cells[indexOfColumn].Visible = false;
    } 
}      

要编辑 .aspx 页面中的网格视图标签,请按以下方式操作:

 <asp:GridView ID="mygrid" runat="server" AllowPaging="True" 
       onpageindexchanging="mygrid_PageIndexChanging" PageSize="15" 
       PersistedSelection="true"  
       ondatabound="mygrid_DataBound"
       OnRowDataBound="mygrid_RowDataBound">

3
这里是简单的答案。创建以下CSS:
.classHide{ display:none } 

那么,如果不想使用column.visible = false,可以将classHideCSS类分配给列。

例如:

grdRole.Columns(0).ItemStyle.CssClass = "classHide"
    grdRole.Columns(0).HeaderStyle.CssClass = "classHide"

该列无法分配,因为它给出了“对象引用未设置”的错误。 - Raghuveera
mygrid.Columns[2].cssClass="classHide" - Indranil.Bharambe
未找到属性cssClass。 - Raghuveera
1
它正在运作。这确实是最好的答案,因为如果您想隐藏一列但仍然可以访问其中的控件,怎么办呢?换句话说,您不希望将其完全从DOM中删除。如果您这样做并且不关心,则.Visible = false就足够了。 - Fandango68
@@Indranil.Bharambe非常感谢你...通过使用CSS类,我可以轻松地在客户端上获取列... - THE LIFE-TIME LEARNER

2

*强调文本*尝试利用ItemDataBound事件,并尝试以下语法动态隐藏列:

   mygrid.Columns[1].Visible = false           //(Example)

数据表的列数从0开始而不是从1开始。所以如果你想要隐藏第二列,索引应该是1。

希望这能帮到你。


@Raghuveera,你也可以利用事件Pre Render来隐藏列。 - Sai Avinash
@Raghuveera,你给定的索引值是多少? - Sai Avinash
因为在数据表中它是第二列,所以是2。 - Raghuveera
@Raghuveera,如果那个方法不起作用的话,你可以尝试使用Prerender。另外一个问题是,你是否设置了AutogenerateColumns=False? - Sai Avinash
我明白你的意思,但是它没有起作用。我会给你列出结构,请稍等。 - Raghuveera
显示剩余3条评论

2

右键单击GridView并选择属性,然后选择事件,您会在其中找到RowDataBound。双击它,在Row data bound中编写以下内容:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[0].Visible = false;
}

0

试试这个:

for (int i = 0; i < YourGrid.Rows.Count; i++)
{
    (YourGrid.Columns[2]).Visible = false;
}

虽然这段代码可能回答了问题,但最好解释一下如何解决问题,并提供代码作为示例或参考。仅有代码的答案可能会令人困惑并缺乏上下文。 - Robert Columbia
感谢@ Robert Columbia - Pavani Manthena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接