2010-09-14 10 views
9

Tengo 4 controles del ListBox del lado del servidor. Todos ellos tienen su propiedad Enabled establecida en false, pero cuando se procesan definitivamente están habilitados. Todos son selección múltiple. No tienen ningún enlace de datos ni código detrás de tocarlos. A continuación se muestra el marcado para todos ellos (guarde la identificación). Estoy ejecutando la v4 de .NET Framework con IIS6.ASP.NET C# El control del servidor ListBox no deshabilitará

<asp:ListBox runat="server" ID="lstProduct" Enabled="false" SelectionMode="Multiple" Rows="6"></asp:ListBox> 

Aquí es el margen de beneficio que se genera por el tiempo de ejecución:

<select size="6" name="ctl00$ctl00$MainContent$MainContent$lstProduct" multiple="multiple" id="MainContent_MainContent_lstProduct" class="aspNetDisabled"> 
+0

Si hace una fuente de vista en el navegador, ¿está el control de renderizado como esperaba? – Kendrick

+0

La fuente HTML no tiene la función deshabilitada = "deshabilitada", pero todas las demás marcas son correctas. Sin embargo, incluye class = "aspNetDisabled", pero esa clase no se encuentra en ninguna de mis hojas de estilo ni en ninguna que haya sido inyectada por ASP.NET. –

Respuesta

13

Encontré una solución. En la sección <system.web> de web.config, debe agregar <pages controlRenderingCompatibilityVersion="3.5">.

Con Asp.net 4.0, cualquier control que no reciba una entrada de usuario específica (cuadro de texto o contraseña), no se representará con un atributo disabled="disabled" cuando se establece Control.Enabled = false.

+1

¿Alguien sabe qué se ha agregado este comportamiento en ASP.net 4? – Jeremy

7

Prueba esto:

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

para quitarlo simplemente puede quitar la etiqueta con discapacidad así:

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

Este me salvó. +1 desde mi lado. :) –

6

Una mejor solución es heredar de la clase ListBox y luego anular la propiedad SupportsDisabledAttribute. La información detallada se puede encontrar en MSDN library

p.

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

En su lugar, puede deshabilitar las opciones dentro del cuadro de selección, ya que esto permitirá el desplazamiento.

//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"); 
    } 
} 

entonces utilice el siguiente CSS, por lo que el usuario puede ver los elementos preseleccionados.

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

Desafortunadamente, desde mis primeras investigaciones, es un poco difícil personalizar los elementos de entrada deshabilitados de una forma sencilla y cruzada. Me he acostumbrado a usar una clase para mis propósitos, sin embargo, esto article regarding styling disabled form elements might help.

También puede observar que en IE, los eventos de clic seguirán activándose, lo que pareció anular la selección de las opciones pero solo en algunas combinaciones de intentar usar [disabled = 'disabled'] [selected = 'selected'] o: marcado: seleccionado, etc.

2

Esto debería considerarse un error en .Net Framework.

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

controles que no están diseñadas para la entrada del usuario (por ejemplo, el control Label) ya no rinde los discapacitados = atributo "desactivado" si su propiedad Enabled se establece en false (o si heredan esta configuración de un control de contenedor).

Consulte también la justificación para el cambio (representación de html válido) en http://msdn.microsoft.com/en-us/library/system.web.ui.control.renderingcompatibility.aspx.

Pero un cuadro de lista está diseñado para la entrada del usuario y el atributo de vulnerabilidad se admite en html, por lo que debe mostrar disabled="disabled".

2

Puede usar un poco de jQuery como una cinta adhesiva hasta que esté correctamente fijado. Si pones esto en alguna parte que se ejecuta para todas las páginas que lo arreglará para todos los cuadros de lista con discapacidad en todas las páginas:

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

Escribe la siguiente línea en el archivo .cs presentar

ListBox.Attributes.Add ("discapacitados ", "cierto");

1

Tuve el mismo problema pero con CheckBoxList.

Al configurar su propiedad Enabled en false no se deshabilitó. El panel en el que estaba dentro tampoco tendría ningún efecto cuando Enabled = false.

La solución fue utilizar un bucle foreach sobre los elementos en CheckBoxList.

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