数据网格控件已禁用

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;

【讨论】:

以上是关于数据网格控件已禁用的主要内容,如果未能解决你的问题,请参考以下文章

基于数据库选择在 ajax 日历控件中突出显示/禁用特定日期

AG 网格:禁用编辑行,除非保存已编辑的行

带有条件禁用控件的内联编辑

如何在 Flex 4 的可编辑数据网格中禁用自动排序

在可编辑数据网格 Flex 中禁用自动保存

asp.net 我可以在单击按钮后禁用数据网格排序操作吗?