似乎是一个常见问题。
我正在尝试隐藏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'语句不会像我说的那样自动生成数据。通过上面的循环,我可以隐藏列的标题文本,但是希望隐藏整个列,并且能够仍然能够访问隐藏数据。
答案 0 :(得分: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标记中。
答案 1 :(得分:1)
为什么不使用GridView.DataKeyNames
和GridView.DataKeys
属性来存储ID,然后使用rowIndex检索它?这也将使列无法自动生成。
答案 2 :(得分:0)
啊......所以问题是Columns没有预定义。
也许您可以使用Linq选择要显示的所有列:
gvTest.DataSource = (from d in dataSource
select new
{
ColumnA = d.ColumnA...
}
或者,您可以使用JavaScript隐藏列;
答案 3 :(得分:0)
这是自动生成列的限制。您放弃了对列的显示方式的大量控制,以方便不预先定义它们。
现在咬紧牙关并定义你的专栏。如果这是您需要进行的唯一自定义,那么您可能会做得很好,但是90%以上的时间我最终会定义列以自定义它们的显示方式。
否则,您最终会遇到一些在各种情况下容易破裂的“调整”(例如,数据源中列的顺序发生变化)。