数据网格控件已禁用
Posted
技术标签:
【中文标题】数据网格控件已禁用【英文标题】:DataGrid Control Disabled 【发布时间】:2010-10-12 18:15:24 【问题描述】:我在 ASP.NET 2.0 中有一个 DataGrid,其中包含以下列:
<ASP:TEMPLATECOLUMN>
<ItemStyle HorizontalAlign="Right"></ItemStyle>
<ItemTemplate>
<asp:HyperLink id="HyperLink1" runat="server"
CssClass="DataGridCommand" Target="_blank"
NavigateUrl='<%# GetPreviewURL(DataBinder.Eval(Container, "DataItem.NodeID")) %>'>
Preview Graphic
</asp:HyperLink>
</ItemTemplate>
</ASP:TEMPLATECOLUMN>
因此,基本思想是在 DataGrid 的每一行中都有一个链接,该链接会返回一个弹出式图像预览(指的是 NodeID 的数据绑定列)。这工作得很好。
我正在尝试禁用没有关联图像的行的链接。为此,我将它放在后面的代码中,在 Page_Load 下:
foreach (DataGridItem dgi in this.dgNode.Items)
HyperLink myLink1 = (HyperLink)dgi.Cells[0].FindControl("HyperLink1");
//myLink1.Visible = false;
//if (condition for hiding links goes here...)
myLink1.Enabled = false;
this.dgNode.DataBind();
如您所见,我尝试将 visible 属性设置为 false,但这不起作用。我尝试将启用设置为false,它也不起作用。然后我再次尝试对 DataGrid 进行数据绑定——不起作用。链接继续正常运行。
有谁知道为什么这不起作用,可以做些什么来使它起作用,如果它存在根本缺陷,另一种解决方案?我希望将某些行的链接变灰,或者将其隐藏以便无法点击。
【问题讨论】:
【参考方案1】:我不确定,但我认为 asp.net 很匆忙,因为您确实有多个对象 Hyperlink1 的实例。 ID 属性是否用作唯一标识符,如果有多个实例,它可能会拒绝对其进行操作。
【讨论】:
【参考方案2】:您应该添加一个事件处理程序来处理 OnItemDataBound 事件,而不是在页面加载时循环遍历项目。然后,您可以在绑定每个项目时在那里找到并禁用超链接。
我认为当前的解决方案不起作用,因为它在将链接设置为不可见或禁用后调用 DataBind() 方法。这将导致 DataGrid 重新构建自身并擦除您刚刚所做的工作。更不用说您为每个项目重新绑定 DataGrid,这会影响性能。
【讨论】:
【参考方案3】:我敢打赌,由于您禁用超链接,然后在事后绑定数据网格,重新绑定本质上是通过其数据绑定代码再次“重新激活”链接。
作为替代方案,您是否考虑过使用 DataGrid 的 ItemDatabound 事件并在那时启用/禁用超链接?所有数据都触手可及,代码看起来与现在几乎相同。
【讨论】:
【参考方案4】:您可以在 OnRowDataBound 事件上处理此问题,如下所示:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
HyperLink hl = (HyperLink)e.Row.FindControl("HyperLink1");
hl.Visible = false;
【讨论】:
以上是关于数据网格控件已禁用的主要内容,如果未能解决你的问题,请参考以下文章