隐藏 GridView 的 ID 列.

3

这似乎是一个常见的问题。

我正在尝试隐藏GridView中的一列。我已经了解到,仅将列设置为“visible = false”将不起作用,因为我正在自动生成数据。

目前我的代码如下:

 protected void Page_Load(object sender, EventArgs e)
    {
        bind();

        if (GridView1.Columns.Count > 0)
            GridView1.Columns[0].Visible = false;
        else
        {
            GridView1.HeaderRow.Cells[0].Visible = false;
            foreach (GridViewRow gvr in GridView1.Rows)
            {
                gvr.Cells[1].Visible = false;
            }
        }

    }

'if'语句不会触发,因为我正在自动生成数据。通过以上循环,我可以隐藏列的标题文本,但希望隐藏整个列,并仍然能够访问隐藏的数据。

4个回答

4
这个问题可以在控件的生命周期后期(当“Columns”集合已填充)再进行处理:
protected void GridView1_PreRender(object sender, EventArgs e)
{
    if (GridView1.Columns.Count > 0)
        GridView1.Columns[0].Visible = false;
    else
    {
        GridView1.HeaderRow.Cells[0].Visible = false;
        foreach (GridViewRow gvr in GridView1.Rows)
        {
            gvr.Cells[1].Visible = false;
        }
    }
}

注意:您需要在GridView标记中添加OnPreRender="GridView1_PreRender".

谢谢你的回答。我看过这个方法,但是我不确定我应该以什么样的对象和事件参数来提供给这个方法?另外,如果触发了那个“else”,它不会隐藏单元格头吗?因为我不希望发生这种情况,只想要整个列被隐藏。 - user1352057
@user1352057 你遇到什么错误了吗?你只需要将该文本添加到GridView标记中(在.aspx页面中)。 - Josh Darnell
@user1352057 这真的很奇怪。是的,你的代码看起来没问题。我得离开一会儿,但我会尽量在今晚稍后再看一下。 - Josh Darnell
@jardarnel27 最终通过 RowDataBound 方法解决了它。 - user1352057
@user1352057 很高兴你能解决它,并且我也能在某种程度上提供帮助 =) - Josh Darnell
显示剩余4条评论

1
为什么不使用 GridView.DataKeyNamesGridView.DataKeys 属性来存储 ID,并在稍后使用 rowIndex 检索它?这也将防止自动生成列。

DataKeyNames

DataKeys


0

这是自动生成列的限制。为了不事先定义它们而方便,您放弃了对列如何显示的很多控制。

现在咬紧牙关,定义您的列。如果这是您需要进行的唯一自定义,则可能没问题,但90%以上的情况下,我最终都要定义列以自定义它们的显示方式。

否则,您将最终拥有许多此类“微调”,它们容易在各种情况下发生错误(例如,列的顺序在数据源中更改)。


@D Stanley,谢谢您的回答。您的意思是事先在服务器端定义它们吗? - user1352057
不,你可以在标记中定义它们。设计师应该在设计时给你屏幕以添加列。 - D Stanley

0
啊...所以问题是列没有预定义。
也许你可以使用Linq来选择你想要显示的所有列:
gvTest.DataSource = (from d in dataSource
                     select new 
                     {
                         ColumnA = d.ColumnA...
                     }

或者,您可以使用JavaScript隐藏列;


我想象这在 OP 的 Page_Load 方法的第一行调用 bind(); 时已经发生在幕后了。 - Josh Darnell
@Narnian。是的,bind()调用了一个方法来填充gridview。 - user1352057

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