DataGrid控件已禁用

时间:2009-03-11 18:54:04

标签: .net asp.net datagrid .net-2.0 hyperlink

我在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 - 不起作用。链接继续正常运行。

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

4 个答案:

答案 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被用作唯一标识符,如果有多个实例,它可能会拒绝操纵它。