链接按钮有一些问题

时间:2010-10-19 06:00:09

标签: c# javascript asp.net gridview linkbutton

我有一个ASP.NET应用程序,其中包含一个gridview。此gridview包含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>

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

您将不得不重新考虑您的解决方案。 LinkBut​​tons简单地生成&lt; A&gt;。 HTML中的标记。 &lt; A&gt;标记不能被“禁用”,因此当您将LinkBut​​ton设置为Disabled时,ASP.NET会从标记中删除HREF,以便单击它不会执行任何操作。我应该指出你的JavaScript用于禁用&lt; A&gt;标签不起作用 - 它使&lt; A&gt;标签看起来已禁用,但仍然可以点击。

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