3

似乎是一个普遍的问题。

我试图隐藏我的 GridView 的一列。我已经读过,简单地将列设置为“可见 = 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 回答 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;
        }
    }
}

注意:您需要添加OnPreRender="GridView1_PreRender"到您的 GridView 标记。

于 2013-03-04T20:15:00.767 回答
1

为什么不使用GridView.DataKeyNamesandGridView.DataKeys属性来存储 ID,然后用 rowIndex 检索它呢?这也将防止该列自动生成。

数据键名

数据键

于 2013-03-04T20:22:40.703 回答
0

啊...所以问题是列没有预定义。

也许您可以使用 Linq 来选择您想要显示的所有列:

gvTest.DataSource = (from d in dataSource
                     select new 
                     {
                         ColumnA = d.ColumnA...
                     }

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

于 2013-03-04T20:10:45.950 回答
0

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

现在咬紧牙关,定义你的列。如果这是您需要进行的唯一自定义,那么您可能会没事,但是 90+% 的时间我最终都会定义列来自定义它们的显示方式。

否则,您最终会遇到一些在各种情况下容易中断的“调整”(例如,数据源中列的顺序发生变化)。

于 2013-03-04T20:16:54.137 回答