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

时间:2010-09-14 13:50:55

标签: c# asp.net listbox

我有4个服务器端ListBox控件。所有这些都将其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">

8 个答案:

答案 0 :(得分:15)

我找到了解决方案。在web.config的<system.web>部分中,您必须添加<pages controlRenderingCompatibilityVersion="3.5">

使用Asp.net 4.0时,如果设置disabled="disabled",则不会使用Control.Enabled = false属性呈现任何不接受特定用户输入(文本框或密码)的控件。

答案 1 :(得分:8)

试试这个:

protected void Page_Load(object sender, EventArgs e)
{
  if (!this.IsPostBack)
  {
   this.lstProduct.Attributes.Add("disabled", "");
  }
}

要删除它,您只需删除已禁用的标记,如下所示:

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

答案 2 :(得分:6)

更好的解决方案是从ListBox类继承,然后重写SupportsDisabledAttribute属性。详细信息可在MSDN library

中找到

e.g。

public class MyListBox : ListBox
{
   public override bool SupportsDisabledAttribute { get { return true; } }
}

答案 3 :(得分:6)

在.cs文件中写下以下行

ListBox.Attributes.Add(“disabled”,“true”);

答案 4 :(得分:2)

这应该被视为.Net Framework中的一个错误。

http://www.asp.net/whitepapers/aspnet4/breaking-changes#0.1__Toc256770141说:

  

如果将Enabled属性设置为false(或者如果它们从容器控件继承此设置),则不为用户输入设置的控件(例如,Label控件)不再呈现disabled =“disabled”属性。

另请参阅http://msdn.microsoft.com/en-us/library/system.web.ui.control.renderingcompatibility.aspx处的更改(呈现有效的html)的基本原理。

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

答案 5 :(得分:2)

在正确修复之前,您可以使用一个小jquery作为bandaid。如果你把它放在所有页面运行的地方,它将为所有页面上的所有禁用列表框修复它:

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

答案 6 :(得分:1)

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

//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} 

不幸的是,从我最初的调查来看,以一种很好的跨浏览器方式设置禁用的输入元素是一件很痛苦的事情。我已经为我的目的使用了一个类,但这是article regarding styling disabled form elements might help

您可能还会注意到,在IE中,仍会触发点击事件,这似乎取消选择了选项,但仅在某些组合中尝试使用[disabled ='disabled'] [selected ='selected']或: :选择等。

答案 7 :(得分:1)

我遇到了同样的问题,但CheckBoxList

将其Enabled属性设置为false并未禁用它。当Enabled = false时,它所在的面板也不会对它产生影响。

解决方案是对CheckBoxList中的项使用foreach循环。

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