【问题标题】:Hide Column in GridView from Code Behind从后面的代码中隐藏 GridView 中的列
【发布时间】:2016-06-30 19:59:54
【问题描述】:

我的页面中有一个网格视图,我必须从后面的代码中设置(某些列有时不包括在内),但有一列包含超链接。我目前在 .aspx 页面中设置 gridview 和超链接列,如下所示:

 <asp:GridView runat="server"  ID="GridView1" >
    <Columns>
        <asp:BoundField DataField="Edit" HtmlEncode="false" HeaderText="" HeaderStyle-Wrap="false" SortExpression="Edit" />
    </Columns>
 </asp:GridView>

我在后面的代码中绑定了其余的数据:

GridView1.DataSource = dt;           
GridView1.DataBind();         
Page.DataBind();

链接栏显示正常,链接按预期工作。但是,创建的 GridView 在左侧有链接列,我要显示的所有列,然后在右侧包含链接字符串的另一列,如下所示:

<a href='ForecastComments.aspx?zip=49905&date=1day'>Edit

有什么方法可以让我摆脱这个专栏,但我的链接专栏仍然存在?我无法从表中删除它,因为我需要访问它的链接列。我尝试将后面的代码更改为:

GridView1.DataSource = dt;           
GridView1.DataBind();            
this.GridView1.Columns[12].Visible = false;
Page.DataBind();

因为我不想显示的列是第 12 列,但 gridview 中的列数显然只有 1(不知道为什么会这样),所以无论如何,它不起作用。奖励:我宁愿将链接列放在表格的右侧,而不是左侧——如果有人也知道如何做到这一点,那就太棒了。

【问题讨论】:

  • 好吧.. 使用调试器.. 当你越过这条线GridView1.DataSource = dt; 使用快速观察并点击放大镜告诉我们有多少列回来了.. 还有列在这种情况是0 base 不是 ``base`
  • @MethodMan 问题是,Gridview1.Columns 唯一计数的列是显式声明的列。所以,当我按照你的建议在调试器中查看时,我可以看到我的表的所有 12 列。但是,我无法访问第 12 列,因为它没有在 .aspx 页面中声明。由于我需要自动生成列,因此我不能只使用上面尝试的方法。

标签: c# asp.net gridview


【解决方案1】:

可以在 GridView 的RowDataBound 事件中移动和/或删除单元格。您可以在标记中设置事件处理程序:

<asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound">

在代码隐藏中,您定义一个变量来保存要删除的链接列的索引:

private int LinkColIndex;

并在将数据绑定到 GridView 之前从 DataTable 中获取其值:

LinkColIndex = dt.Columns["Edit"].Ordinal;
GridView1.DataSource = dt;           
GridView1.DataBind();

最后,您在RowDataBound 事件处理程序中处理每一行的单元格:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    TableCell cell = e.Row.Cells[0];
    e.Row.Cells.RemoveAt(0);
    e.Row.Cells.RemoveAt(LinkColIndex);
    e.Row.Cells.Add(cell);
}

【讨论】:

  • 这不起作用;我在调试时在该函数的中间放置了一个断点,但它甚至没有到达那里。
  • 该代码已经过测试,并且可以正常工作。我认为您没有正确设置事件处理程序。
  • 我添加了您提供的所有代码。我还有什么需要做的吗?
  • 如果您在标记中设置OnRowDataBound="GridView1_RowDataBound",则事件处理程序应在您将数据绑定到GridView 后触发(除非数据源没有记录)。您可以检查是否在代码隐藏中为同一事件设置了另一个处理程序(类似于GridView1.RowDataBound += ...)。
  • 你完全正确;对不起,由于我有旧代码,我正在其他地方更改它。非常感谢!
猜你喜欢
  • 2020-03-10
  • 2011-04-18
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
相关资源
最近更新 更多