【问题标题】:GridView RowDataBound doesn't fire on postbackGridView RowDataBound 在回发时不会触发
【发布时间】:2023-03-10 01:25:01
【问题描述】:

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

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

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

【问题讨论】:

  • 你在 ajax UpdatePanel 中有网格吗?这可能会赶上回发。
  • 不,这个特定页面上没有更新面板。

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


【解决方案1】:

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

【讨论】:

  • 但是,遗憾的是,e.Row.DataItem 在 RowCreated 上为空,而在 RowDataBound 上为非空:(
【解决方案2】:

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

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

我不知道这是最好的方法,但它确实有效,这比我尝试过的任何其他方法都好。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:
          protected void btnHazardRating_Click(object sender, EventArgs e)
          {
              gvPanelRole.RowDataBound += new GridViewRowEventHandler(gvPanelRole_RowDataBound);
          
              gvPanelRole.DataSource = dtGo;
              gvPanelRole.DataBind();
              ModalPopup.Show();
          
          }
          

          【讨论】:

          • 欢迎您,在这里,解释为什么要使用您的解决方案而不是如何使用是一个很好的做法。这将使您的答案更有价值,并帮助进一步的读者更好地理解您是如何做到的。我还建议您查看我们的常见问题解答:stackoverflow.com/faq
          【解决方案7】:
          void Process Rows()
          {
              ... do something
              ... process complete
              datagrid.DataBind();
          }
          

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 2010-10-03
              • 1970-01-01
              • 1970-01-01
              • 2014-08-21
              • 2016-08-03
              • 1970-01-01
              • 2014-04-26
              • 2013-04-11
              • 1970-01-01
              相关资源
              最近更新 更多