2010-09-14 27 views
9

Mam 4 kontrolki ListBox po stronie serwera. Wszystkie z nich mają ustawioną właściwość Enabled na false, ale po renderowaniu są zdecydowanie włączone. Wszystkie są wielokrotnego wyboru. Nie mają powiązania danych ani żadnego kodu za ich dotknięciem. Poniżej znajduje się znacznik dla wszystkich z nich (zapisz identyfikator). Korzystam z wersji 4 platformy .NET Framework z IIS6.Kontrolka serwera ListBox ASP.NET nie zostanie wyłączona

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

Oto znaczników, które są generowane przez program:

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

Jeśli robisz źródło widoku w przeglądarce, czy renderowanie sterowania jest zgodne z oczekiwaniami? – Kendrick

+0

Źródło HTML nie ma wyłączonej = "wyłączone", ale wszystkie inne znaczniki są poprawne. Zawiera jednak klasę = "aspNetDisabled", ale tej klasy nigdzie nie można znaleźć przez żaden z moich arkuszy stylów lub które są wstrzykiwane przez ASP.NET. –

Odpowiedz

13

Znalazłem rozwiązanie. W sekcji web.config <system.web> należy dodać <pages controlRenderingCompatibilityVersion="3.5">.

W przypadku programu Asp.net 4.0 dowolny element sterujący, który nie przyjmuje określonych danych wejściowych użytkownika (pole tekstowe lub hasło), nie zostanie wyrenderowany z atrybutem disabled="disabled" po ustawieniu Control.Enabled = false.

+1

Ktoś wie, jakie to zachowanie zostało dodane w ASP.net 4? – Jeremy

7

Spróbuj tego:

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

Aby usunąć go można po prostu usunąć tag niepełnosprawnej tak:

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

Ten mnie uratował. +1 z mojej strony :) –

6

Lepszym rozwiązaniem jest dziedziczenie z klasy ListBox, a następnie przesłonięcie właściwości SupportsDisabledAttribute. Szczegółowe informacje można znaleźć w MSDN library

np.

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

Możesz zamiast tego wyłączyć opcje w polu wyboru, ponieważ umożliwi to przewijanie.

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

Następnie używam następującego pliku CSS, aby użytkownik mógł nadal widzieć wstępnie wybrane pozycje.

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

Niestety z moich wstępnych badań jest nieco trudny styl wyłączonych elementów wejściowych w przyjemny sposób w przeglądarce. Ustawiłem przy użyciu klasy do moich celów, jednak to article regarding styling disabled form elements might help.

Można również zauważyć, że w IE zdarzenia kliknięcia będą nadal wyzwalane, co wydaje się odznaczać opcje, ale tylko w niektórych kombinacjach próbujących użyć [disabled = 'disabled'] [selected = 'selected'] lub: sprawdzone: wybrane itp.

2

To powinno być uznane za błąd w .Net Framework.

http://www.asp.net/whitepapers/aspnet4/breaking-changes#0.1__Toc256770141 mówi:

kontroli, które nie są przeznaczone do wprowadzania danych przez użytkownika (na przykład kontrola Label) nie czynią disabled = „disabled” atrybut, jeśli ich Enabled właściwość jest ustawiona na false (lub jeśli dziedziczą to ustawienie z kontrolki kontenera).

Zobacz również uzasadnienie zmiany (renderowanie prawidłowego html) pod adresem http://msdn.microsoft.com/en-us/library/system.web.ui.control.renderingcompatibility.aspx.

Ale okno listy jest przeznaczone do wprowadzania danych przez użytkownika, a atrybut disbled jest obsługiwany w html, więc powinien renderować disabled="disabled".

2

Możesz użyć małego jquery jako bandaid, dopóki nie zostanie to właściwie naprawione. Jeśli umieścisz to gdzieś, że prowadzony na wszystkich stronach będzie naprawić go dla wszystkich listboxes niepełnosprawnych na wszystkich stronach:

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

Wpisz następujący wiersz w .cs plik

ListBox.Attributes.Add ("wyłączone ", "prawdziwe");

1

Miałem ten sam problem, ale z CheckBoxList.

Ustawienie na false wartości właściwości nie spowodowało jej wyłączenia. Panel, w którym się znajdował, również nie miałby na niego wpływu, gdy Enabled = false.

Rozwiązaniem było użycie pętli foreach na elementach w CheckBoxList.

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