我有一个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("DGDocuments$ctl23$lnkAddRules", "", true, "", "", 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("DGDocuments$ctl23$lnkFieldPermssion", "", true, "", "", 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>
请帮我解决这个问题。提前谢谢。
答案 0 :(得分:4)
看起来当您禁用LinkButton服务器端时,它不会为 a 标记生成onclick事件处理程序。因此,一旦通过JavaScript启用LinkButton,它就不知道如何回发。我建议正常渲染LinkButton然后通过JavaScript禁用它或者将AutoPostback设置为True以获取复选框并执行启用服务器端。
答案 1 :(得分:1)
您将不得不重新考虑您的解决方案。 LinkButtons简单地生成&lt; A&gt;。 HTML中的标记。 &lt; A&gt;标记不能被“禁用”,因此当您将LinkButton设置为Disabled时,ASP.NET会从标记中删除HREF,以便单击它不会执行任何操作。我应该指出你的JavaScript用于禁用&lt; A&gt;标签不起作用 - 它使&lt; A&gt;标签看起来已禁用,但仍然可以点击。
为了让客户端工作,您需要使用JavaScript函数来添加和删除&lt; A&gt;中的HREF。标签。其他选项包括执行服务器端的所有操作,以便ASP.NET处理HREF的删除和添加,或切换到不同的控件,例如常规的asp:Button,可以启用和禁用。