GridView RowDataBound不会在回发时触发

时间:2008-11-10 22:45:31

标签: c# asp.net vb.net gridview postback

在ASP.NET页面上,我有一个填充了LINQ查询结果的GridView。我在代码中设置DataSource,然后在其上调用DataBind。在GridView的RowDataBound事件中,我根据查询结果选择性地隐藏某些GridView字段中的链接。 (例如,我隐藏有问题的行的“显示父级”链接没有父行。)

这最初工作正常。但是在回发时(当我调用DataBind,但GridView保持通过ViewState填充时),数据显示,但RowDataBound事件(显然)不会触发,而我的链接不会隐藏起来。

回发后隐藏链接的最佳方法是什么?

8 个答案:

答案 0 :(得分:2)

以下是我最终解决这个问题的方法:

  1. 我创建了一个具有readonly属性的可序列化类:一行的PK,以及每个链接的布尔值,指示它是否已启用。我们称之为LinkVisibility
  2. 我创建了一个可序列化的类,继承自KeyedCollection以保存上面类的实例。
  3. 我创建了一个ViewState支持的属性,其中包含该集合的一个实例。
  4. 在我的搜索过程(填充GridView)中,我清除了该集合。
  5. 在最初显示/隐藏链接的RowDataBound中,我为每行的集合添加了一个LinkVisibility实例。
  6. 在Page.Load中,当IsPostBack为true时,我循环遍历GridView行。我在集合中通过PK查找每个LinkVisibility(在GridView中设置DataKeyNames),然后相应地设置链接。
  7. 我不知道这是做到这一点的最佳方法,但它确实有效,这比我试过的任何其他事情都要多。

答案 1 :(得分:2)

RowDataBound事件仅在回发期间GridView的数据发生更改时触发。事件因速度而短路,因此不会不必要地重新生成完全相同的数据。使用RowCreated事件来操纵HTML - 无论数据是否已更改,它都会在每次回发时触发。

答案 2 :(得分:1)

1)你可以有一个方法 - 在Grid_DataBound(...)上调用一次的ProcessDataRows()。然后在PostBack之后需要它时。

这样就可以在需要时处理所有行。

2)您可以使用ShowParentLink()等方法。然后将其绑定到网格中的LinkBut​​ton(如果您使用的是ItemTemplate)并且链接将具有

Visible='<%#ShowParentLink()%>'

答案 3 :(得分:0)

我原本期望视图状态也反映出您已删除某些链接的事实(假设在保存视图状态之前删除了它们)。

也许这就是你需要问'为什么删除的链接仍然出现在视图状态?'的问题。

答案 4 :(得分:0)

页面无法处理回发事件,除非它重建完全之前(回发)。如果您在page-init期间重新隐藏链接,则应触发您的点击事件等。不幸的是,如果没有看到一些示例代码,我就无法更具体。

由于您不是数据绑定,因此数据RowDataBound不会触发。您正在从viewstate重新构建页面 - “viewstate binding”,因为缺少更好的单词。

答案 5 :(得分:0)

另一种解决方案是将逻辑放在LINQ查询中,以便最终得到一个类似“ShowParentLink”的布尔LINQ字段。然后,您可以将HyperLink字段的Visible属性绑定到该值 - 不需要RowDataBound。

答案 6 :(得分:0)

void Process Rows()
{
    ... do something
    ... process complete
    datagrid.DataBind();
}

答案 7 :(得分:0)

protected void btnHazardRating_Click(object sender, EventArgs e)
{
    gvPanelRole.RowDataBound += new GridViewRowEventHandler(gvPanelRole_RowDataBound);

    gvPanelRole.DataSource = dtGo;
    gvPanelRole.DataBind();
    ModalPopup.Show();

}