我在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,但这不起作用。我尝试将enable设置为false,但它也没有用。然后我再次尝试数据绑定DataGrid - 不起作用。链接继续正常运行。
有谁知道为什么这不起作用,可以做些什么来使它工作,如果它有根本缺陷,另一种解决方案?我希望将某些行的链接灰显,或隐藏它以便无法点击。
答案 0 :(得分:2)
您可以在OnRowDataBound事件中处理此问题,如下所示:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
HyperLink hl = (HyperLink)e.Row.FindControl("HyperLink1");
hl.Visible = false;
}
答案 1 :(得分:1)
您应该添加一个事件处理程序来处理OnItemDataBound事件,而不是通过页面加载中的项循环。然后,您可以在每个项目绑定时找到并禁用HyperLink。
我认为当前的解决方案无效,因为在将链接设置为不可见或禁用后调用DataBind()方法。这将导致DataGrid重建自己并删除您刚刚完成的工作。更不用说你为每个项目重新绑定你的DataGrid,这是一个性能损失。
答案 2 :(得分:1)
我要下注,因为您正在禁用超链接然后在事实之后绑定datagrid,重新绑定实际上是通过其数据绑定代码再次“重新激活”链接。
作为替代方案,您是否考虑过使用DataGrid的ItemDatabound事件并在此时启用/禁用超链接?您可以轻松获得所有数据,代码看起来与您现在的相同。
答案 3 :(得分:0)
我不确定,但我认为asp.net很急,因为你确实有多个对象Hyperlink1的实例。不是ID proprety被用作唯一标识符,如果有多个实例,它可能会拒绝操纵它。