8

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

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

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

4

8 回答 8

3

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

于 2011-10-25T21:55:46.987 回答
2

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

  1. 我创建了一个具有只读属性的可序列化类:一行的 PK,以及每个链接的布尔值,指示它是否已启用。我们会调用它LinkVisibility
  2. 我创建了一个继承自 KeyedCollection 的可序列化类来保存上述类的实例。
  3. 我创建了一个 ViewState 支持的属性,其中包含该集合的一个实例。
  4. 在我的搜索过程(填充 GridView)中,我清除了集合。
  5. 在最初显示/隐藏链接的 RowDataBound 中,我LinkVisibility为每一行添加一个实例到集合中。
  6. 在 Page.Load 中,当 IsPostBack 为 true 时,我会遍历 GridView 行。我LinkVisibility在集合中通过 PK 查找每个(DataKeyNames 在 GridView 中设置),并相应地设置链接。

我不知道这是做到这一点的最佳方式,但它确实有效,这比我尝试过的其他任何事情都多。

于 2008-11-12T21:33:15.103 回答
1

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

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

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

Visible='<%#ShowParentLink()%>'
于 2008-11-11T18:31:56.093 回答
0

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

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

于 2008-11-11T15:31:17.173 回答
0

页面无法处理回发事件,除非它完全按照以前的方式重建(回发)。如果您在页面初始化期间重新隐藏您的链接,那么您的点击事件等应该会触发。不幸的是,没有看到一些示例代码,我无法获得更具体的信息。

此外,数据 RowDataBound 不会触发,因为您不是数据绑定。由于缺少更好的词,您正在从视图状态-“视图状态绑定”重建页面。

于 2008-11-11T19:24:06.707 回答
0

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

于 2008-11-12T02:23:52.740 回答
0
void Process Rows()
{
    ... do something
    ... process complete
    datagrid.DataBind();
}
于 2009-02-05T13:01:26.117 回答
0
protected void btnHazardRating_Click(object sender, EventArgs e)
{
    gvPanelRole.RowDataBound += new GridViewRowEventHandler(gvPanelRole_RowDataBound);

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

}
于 2012-03-30T10:31:11.303 回答