C# ASP.NET C ListBox服务器控件将不会禁用

C# ASP.NET C ListBox服务器控件将不会禁用,c#,asp.net,listbox,C#,Asp.net,Listbox,我有4个服务器端列表框控件。所有这些对象的Enabled属性都设置为false,但在渲染时它们肯定是启用的。它们都是多选的。它们没有数据绑定或任何代码。下面是它们的标记(保存ID)。我正在使用IIS6运行.NET Framework的v4 <asp:ListBox runat="server" ID="lstProduct" Enabled="false" SelectionMode="Multiple" Rows="6"></asp:ListBox> 以下是运行时生成

我有4个服务器端列表框控件。所有这些对象的Enabled属性都设置为false,但在渲染时它们肯定是启用的。它们都是多选的。它们没有数据绑定或任何代码。下面是它们的标记(保存ID)。我正在使用IIS6运行.NET Framework的v4

<asp:ListBox runat="server" ID="lstProduct" Enabled="false" SelectionMode="Multiple" Rows="6"></asp:ListBox>
以下是运行时生成的标记:

<select size="6" name="ctl00$ctl00$MainContent$MainContent$lstProduct" multiple="multiple" id="MainContent_MainContent_lstProduct" class="aspNetDisabled">
试试这个:

protected void Page_Load(object sender, EventArgs e)
{
  if (!this.IsPostBack)
  {
   this.lstProduct.Attributes.Add("disabled", "");
  }
}
要删除它,只需删除禁用的标记,如下所示:

this.lstProduct.Attributes.Remove("disabled");

我找到了解决办法。在web.config的部分中,必须添加


在Asp.net 4.0中,设置control.Enabled=false时,任何不接受特定用户输入文本框或密码的控件都不会使用disabled=disabled属性呈现。

更好的解决方案是从ListBox类继承,然后重写SupportsDisabledAttribute属性。有关详细信息,请参阅

e、 g


您可能希望禁用选择框中的选项,因为这将允许滚动

//Listbox cannot be disabled directly, instead the inners should be disabled instead.
foreach(ListItem item in lbCategory.Items)
{
    item.Attributes.Add("disabled", "disabled");

    if (item.Selected)
    {
        //cannot reliably style with [disabled='disabled'][selected='selected'] or :checked:selected etc, so need a class
        item.Attributes.Add("class", "disabledSelected"); 
    }
}
然后我使用下面的CSS,这样用户仍然可以看到预选的项目

/* Slightly lighter colour than the normal #3399FF because you cannot change the foreground color in IE, so means that it isn't contrasted enough */
select option.disabledSelected { background-color: #97cbff !important} 
不幸的是,从我最初的调查来看,以一种很好的跨浏览器方式设置禁用的输入元素的样式有点困难。我已经开始为我的目的使用一个类,然而这是不可能的


您可能还注意到,在IE中,仍然会触发click事件,这似乎取消了选项选择,但仅在尝试使用[disabled='disabled'][selected='selected']或:checked:selected等的某些组合中才会触发。这应被视为.Net Framework中的错误

说:

不是为用户输入而设计的控件。例如,如果标签控件的Enabled属性设置为false或从容器控件继承此设置,则标签控件不再呈现disabled=disabled属性

另请参见中呈现有效html的更改的基本原理


但是列表框是为用户输入而设计的,html中支持disbled属性,因此它应该呈现disabled=disabled。

您可以使用一点jquery作为bandaid,直到正确修复为止。如果您将其放在对所有页面运行的某个位置,它将修复所有页面上所有禁用的列表框:

$(document).ready(function () {
    $("select.aspNetDisabled").attr('disabled', 'disabled');
});

在.cs文件中写入以下行


ListBox.Attributes.Adddisabled,true

我也遇到了同样的问题,只是检查框列表有问题

foreach (var item in checkBoxList.Items.Cast<ListItem>())
{
    item.Enabled = false;
}
将其Enabled属性设置为false并没有禁用它。当Enabled=false时,它所在的面板也不会对其产生影响

解决方案是在复选框列表中的项目上使用foreach循环

foreach (var item in checkBoxList.Items.Cast<ListItem>())
{
    item.Enabled = false;
}

如果在浏览器中查看源,控件呈现是否如预期的那样?HTML源没有disabled=disabled,但所有其他标记都正确。但是,它确实包含class=aspNetDisabled,但是我的任何样式表或ASP.NET注入的任何样式表都找不到该类。这个类救了我+我这边的1.:有人知道ASP.net 4中添加了什么行为吗?