在ASP.NET页面上,我有一个填充了LINQ查询结果的GridView。我在代码中设置DataSource,然后在其上调用DataBind。在GridView的RowDataBound事件中,我根据查询结果选择性地隐藏某些GridView字段中的链接。 (例如,我隐藏有问题的行的“显示父级”链接没有父行。)
这最初工作正常。但是在回发时(当我不调用DataBind,但GridView保持通过ViewState填充时),数据显示,但RowDataBound事件(显然)不会触发,而我的链接不会隐藏起来。
回发后隐藏链接的最佳方法是什么?
答案 0 :(得分:2)
以下是我最终解决这个问题的方法:
LinkVisibility
。LinkVisibility
实例。LinkVisibility
(在GridView中设置DataKeyNames),然后相应地设置链接。我不知道这是做到这一点的最佳方法,但它确实有效,这比我试过的任何其他事情都要多。
答案 1 :(得分:2)
RowDataBound事件仅在回发期间GridView的数据发生更改时触发。事件因速度而短路,因此不会不必要地重新生成完全相同的数据。使用RowCreated事件来操纵HTML - 无论数据是否已更改,它都会在每次回发时触发。
答案 2 :(得分:1)
1)你可以有一个方法 - 在Grid_DataBound(...)上调用一次的ProcessDataRows()。然后在PostBack之后需要它时。
这样就可以在需要时处理所有行。
2)您可以使用ShowParentLink()等方法。然后将其绑定到网格中的LinkButton(如果您使用的是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();
}