0

我有一个包含一个gridview 的ASP.NET 应用程序。此网格视图包含 4 个复选框模板列和 2 个链接按钮模板列。如果我单击第一个复选框,则应该启用两个链接按钮,否则它们应该处于禁用模式。此功能运行良好。但我的问题是,在表单加载时,它会检查第一列是否被选中。如果未选中该复选框,则链接按钮将处于禁用模式。但勾选此复选框后,它将启用,但没有重定向链接。我的代码如下所示。

 protected void DGDocuments_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
        if (e.Item.ItemIndex == -1) return;

        BindCheckBox(e.Item, "chkRead");
        BindCheckBox(e.Item, "chkCreate");
        BindCheckBox(e.Item, "chkUpdate");
        BindCheckBox(e.Item, "chkDelete");

        CheckBox chkID = (CheckBox)e.Item.FindControl("chkRead");
        if (!chkID.Checked)
        {
            LinkButton lnkPermission = (LinkButton)e.Item.FindControl("lnkFieldPermssion");
            LinkButton lnkSetRules = (LinkButton)e.Item.FindControl("lnkAddRules");

            lnkPermission.Enabled = false;
            lnkSetRules.Enabled = false;
        }
    }

在设计器页面中:

 <asp:TemplateColumn HeaderText="Read" ItemStyle-HorizontalAlign="Center">
     <ItemTemplate>
         <asp:CheckBox ID="chkRead" runat="server" Text='<%# Eval("Read") %>' onclick="javascript:EnablePermissoin(this,5,6);" />
     </ItemTemplate>
 </asp:TemplateColumn>
 <asp:TemplateColumn HeaderText="Rules" ItemStyle-HorizontalAlign="Center" ItemStyle-Font-Bold="true">
     <ItemTemplate>
         <asp:LinkButton ID="lnkAddRules" Text="Add Rules" runat="server"  CommandName="cmdSetRules"  />
     </ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Field Permission" ItemStyle-HorizontalAlign="Center" ItemStyle-Font-Bold="true">
    <ItemTemplate>
        <asp:LinkButton ID="lnkFieldPermssion" Text="Set" runat="server" CommandName="cmdFieldPermission" />
    </ItemTemplate>
</asp:TemplateColumn>

Javascript是:

function EnablePermissoin(chkB, cellNumber1, cellNumber2) {
        var IsChecked = chkB.checked;
        if (IsChecked) {

            var cell1 = chkB.parentElement.parentElement.cells[cellNumber1];
            for (i = 0; i < cell1.childNodes.length; i++) {
                if (cell1.childNodes[i].tagName == "A") {
                    cell1.childNodes[i].disabled = false;

                }
            }
            var cell2 = chkB.parentElement.parentElement.cells[cellNumber2];
            for (i = 0; i < cell2.childNodes.length; i++) {
                if (cell2.childNodes[i].tagName == "A") {
                    cell2.childNodes[i].disabled = false;
                }

            }

        }
        else {
            var cell1 = chkB.parentElement.parentElement.cells[cellNumber1];
            for (i = 0; i < cell1.childNodes.length; i++) {
                if (cell1.childNodes[i].tagName == "A") {

                    cell1.childNodes[i].disabled = true;
                }

            }
            var cell2 = chkB.parentElement.parentElement.cells[cellNumber2];
            for (i = 0; i < cell2.childNodes.length; i++) {
                if (cell2.childNodes[i].tagName == "A") {

                    cell2.childNodes[i].disabled = true;
                }
            }
        }
    }

这是从浏览器的视图源获得的代码,没有在表单加载时禁用链接按钮:

<td align="center" style="font-weight:bold;">
    <a id="DGDocuments_ctl23_lnkAddRules" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;DGDocuments$ctl23$lnkAddRules&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))">Add Rules</a>
</td><td align="center" style="font-weight:bold;">
    <a id="DGDocuments_ctl23_lnkFieldPermssion" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;DGDocuments$ctl23$lnkFieldPermssion&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, true))">Set</a>
</td>

如果我在加载时禁用链接按钮,这将是从视图源获得的代码:

<td align="center" style="font-weight:bold;">
    <a id="DGDocuments_ctl23_lnkAddRules" disabled="disabled">Add Rules</a>
</td><td align="center" style="font-weight:bold;">
    <a id="DGDocuments_ctl23_lnkFieldPermssion" disabled="disabled">Set</a>
</td>

请帮我解决这个问题。提前致谢。

4

2 回答 2

4

看起来当您禁用 LinkBut​​ton 服务器端时,它不会为a标签生成 onclick 事件处理程序。因此,一旦您通过 JavaScript 启用 LinkBut​​ton,它就不知道如何回发。我建议要么正常渲染 LinkBut​​ton,然后通过 JavaScript 禁用它,要么将复选框的 AutoPostback 设置为 True 并在服务器端启用。

于 2010-10-19T17:13:35.277 回答
1

您将不得不重新考虑您的解决方案。LinkBut​​tons 只是在 HTML 中生成一个 <A> 标记。<A> 标记不能被“禁用”,因此当您将 LinkBut​​ton 设置为禁用时,ASP.NET 会从标记中删除 HREF,因此单击它不会执行任何操作。我应该指出,用于禁用 <A> 标记的 JavaScript 不起作用 - 它使 <A> 标记看起来被禁用,但它仍然是可点击的。

为了使客户端工作,您将需要您的 JavaScript 函数从 <A> 标记中添加和删除 HREF。其他选项包括在服务器端执行所有操作,以便 ASP.NET 处理 HREF 的删除和添加,或切换到其他控件,例如可以启用和禁用的常规 asp:Button。

于 2010-10-19T17:49:22.050 回答