我正在开发一个ASP.NET应用程序C#。我的页面中有一个网格视图。我有一个列表框控件,默认已启用属性由 false 设置。我正在尝试启用&在 Checkbox 控件上禁用来自javascript / jQuery的控件。
我的ASP代码:
<asp:GridView ID="gvWhom" runat="server" AutoGenerateColumns="False" DataSourceID="odsWhom"
GridLines="None" Width="100%" OnRowDataBound="gvWhom_RowDataBound">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
</HeaderTemplate>
<ItemTemplate>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr style="height: 25px;">
<td width="20%">
<asp:CheckBox ID="chkCriteria" runat="server" Text='<%#Eval("TargetType") %>' />
</td>
<td width="80%">
<asp:ListBox ID="lbCriteria" runat="server" CssClass="ddl" Width="150px" Height="50px"
Enabled="false" SelectionMode="Multiple"></asp:ListBox>
</td>
</table>
</ItemTemplate>
<HeaderStyle Height="2px" />
</asp:TemplateField>
</Columns>
</asp:GridView>
Javascript代码:
function disableDropDown(chkCriteria, lbCriteria) {
if (document.getElementById(chkCriteria).checked) {
document.getElementById(lbCriteria).removeAttribute('disabled');
}else{
document.getElementById(lbCriteria).value = -1;
document.getElementById(lbCriteria).disabled = true;
}
return true;
}
C#代码:
protected void gvWhom_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
ListBox lbCriteria = (ListBox)e.Row.FindControl("lbCriteria");
CheckBox chkCriteria = (CheckBox)e.Row.FindControl("chkCriteria");
chkCriteria.Attributes.Add("onchange", "javascript:return disableDropDown('" + chkCriteria.ClientID + "', '" + lbCriteria.ClientID + "')");
}
}
使用上面的代码我可以启用/禁用Listbox控件。但是,当我启用控件并选择多个项目并提交表单时,我无法找到列表框的所选项目。
如何获取Listbox的选定项?或者是否有其他方法可以启用 - 禁用列表框控件并使用c#代码获取所选项目?
答案 0 :(得分:0)
这主要是猜测,但值得一试......
您在此处禁用服务器端的控件:
<asp:ListBox ID="lbCriteria" runat="server" CssClass="ddl" Width="150px" Height="50px"
Enabled="false" SelectionMode="Multiple"></asp:ListBox>
Enabled="false"
可能向ASP.NET指示它不需要跟踪此控件,不会对其进行更改。那个可能是你回发到服务器时没有收到数据的原因。
让我们尝试从服务器(ASP.NET)的角度保持控件的启用,并完全在客户端(JavaScript)方面维护UI中的启用/禁用。从根本上删除ASP.NET的内置框架,为您决定要跟踪哪些数据。
首先启用服务器端控制标记中的控件:
<asp:ListBox ID="lbCriteria" runat="server" CssClass="ddl" Width="150px" Height="50px"
SelectionMode="Multiple"></asp:ListBox>
其余部分由JavaScript处理。您已经有一些JavaScript代码,您说在客户端为您启用/禁用控件,对吗?因此,当您首先在浏览器中加载页面以禁用客户端控件时,您现在需要做的就是为控件的每个实例调用相同的JavaScript。这是你想要的部分:
document.getElementById(lbCriteria).value = -1;
document.getElementById(lbCriteria).disabled = true;
现在,看起来你正在从服务器端代码绑定你的JavaScript事件,这是我无法提供帮助的地方,因为这种方法对我来说并不是特别直观。 (它混合了JavaScript和C#,感觉有些倒退。)所以我不是完全确定你采取的方法。
基本上,您希望为控件的每个实例调用这两行JavaScript,并且希望在浏览器中加载页面时立即执行。
在jQuery中我会做这样的事情:
$(function () {
$('select.ddl').attr('disabled', 'disabled');
});
这将在加载DOM时运行,并将disabled
属性(值"disabled"
}添加到select
类ddl
。