2

我在 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 进行数据绑定——不起作用。链接继续正常运行。

有谁知道为什么这不起作用,可以做些什么来使它起作用,如果它从根本上存在缺陷,另一种解决方案?我希望将某些行的链接变灰,或者将其隐藏以使其无法单击。

4

4 回答 4

2

您可以在OnRowDataBound事件上处理此问题,如下所示:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    HyperLink hl = (HyperLink)e.Row.FindControl("HyperLink1");
    hl.Visible = false;
}
于 2009-03-11T19:02:16.767 回答
1

您应该添加一个事件处理程序来处理 OnItemDataBound 事件,而不是在页面加载时循环遍历项目。然后,您可以在绑定每个项目时在那里找到并禁用超链接。

我相信当前的解决方案不起作用,因为它在将链接设置为不可见或禁用后调用 DataBind() 方法。这将导致 DataGrid 重新构建自身并擦除您刚刚所做的工作。更不用说您为每个项目重新绑定 DataGrid,这会影响性能。

于 2009-03-11T19:00:23.697 回答
1

我敢打赌,由于您禁用超链接,然后在事后绑定数据网格,重新绑定本质上是通过其数据绑定代码再次“重新激活”链接。

作为替代方案,您是否考虑过使用 DataGrid 的 ItemDatabound 事件并在那时启用/禁用超链接?所有数据都触手可及,代码看起来与现在几乎相同。

于 2009-03-11T19:01:55.487 回答
0

我不确定,但我认为 asp.net 很匆忙,因为您确实有多个对象 Hyperlink1 的实例。不是 ID 属性用作唯一标识符,如果有多个实例,它可能拒绝操作它。

于 2009-03-11T19:00:08.253 回答