2013-06-14 10 views
7

Ho due elenchi a discesa con una manciata di elementi.Come disabilitare un elemento elenco di selezione in base a una selezione utente su un altro menu a discesa in ASP.NET?

Se l'utente seleziona X, X deve essere disabilitato dalla successiva discesa.

Se l'utente seleziona Y, Y deve essere disabilitato dalla successiva discesa.

E viceversa.

Ho provato questo ma non funziona:

protected void ddlSearchColumn1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    var ddl = (DropDownList) sender; 

    string itemSelected = ddl.SelectedValue; 

    ddlSearchColumn2.Items.FindByValue(itemSelected).Enabled = false; 
} 

Qualcuno può darmi una mano?

+0

utilizzare JavaScript. –

+0

Lo farei con jQuery ..non c'è bisogno di causare un postback per qualcosa di simile. –

+0

potresti darmi un esempio? im nuovo allo sviluppo web –

risposta

8

Eri molto vicino:

Markup:

List 1: <asp:DropDownList ID="ddlSearchColumn1" runat="server" OnSelectedIndexChanged="ddlSearchColumn1_SelectedIndexChanged" AutoPostBack="true" /> 
List 2: <asp:DropDownList ID="ddlSearchColumn2" runat="server" AutoPostBack="true" /> 

codice sottostante:

public partial class _Default : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     {//JUST PUT SOMETHING IN THE DROPDOWN BOXES 
      var items1 = new List<ListItem>() 
      { 
       new ListItem("Select Option"), 
       new ListItem("Test 1"), 
       new ListItem("Test 2"), 
       new ListItem("Test 3") 
      }; 

      var items2 = new List<ListItem>() 
      { 
       new ListItem("Select Option", ""), 
       new ListItem("DDL 2 Test 1"), 
       new ListItem("DDL 2 Test 2"), 
       new ListItem("DDL 2 Test 3") 
      }; 

      ddlSearchColumn1.DataSource = items1; 
      ddlSearchColumn1.DataBind(); 

      ddlSearchColumn2.DataSource = items2; 
      ddlSearchColumn2.DataBind(); 
     } 
    } 

    protected void ddlSearchColumn1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     DropDownList list = sender as DropDownList; 
     if (list == null || list.SelectedValue.ToLower() != "test 1") // OR WHATEVER YOUR CRITERIA IS 
      return; 

     ddlSearchColumn2.Items.FindByValue("DDL 2 Test 1").Attributes.Add("Disabled", "Disabled"); 
    } 
} 

SE si è inte riposato in una soluzione lato client:

Con jQuery:

List 1: <asp:DropDownList ID="ddlSearchColumn1" runat="server" /> 
List 2: <asp:DropDownList ID="ddlSearchColumn2" runat="server" /> 

<script> 
    jQuery('#<%= ddlSearchColumn1.ClientID %>').change(function() 
    { 
     if (jQuery(this).val() != 'Test 1')//CHANGE YOUR CRITERIA 
      return; 

     jQuery('#<%= ddlSearchColumn2.ClientID %> option[value="DDL 2 Test 1"]').attr('disabled', 'disabled'); 
    }); 
</script> 

Proprio utilizzando JavaScript nessuna libreria:

List 1: <asp:DropDownList ID="ddlSearchColumn1" runat="server" /> 
List 2: <asp:DropDownList ID="ddlSearchColumn2" runat="server" /> 

<script> 
    document.getElementById('<%= ddlSearchColumn1.ClientID %>').onchange = function() 
    { 
     var orgDdl = document.getElementById('<%= ddlSearchColumn1.ClientID %>'); 
     var org2ddl = document.getElementById('<%= ddlSearchColumn2.ClientID %>'); 

     if (orgDdl.value != 'Test 1') 
      return; 

     for (var i = 0, ii = org2ddl.options.length; i < ii; i++) 
     { 
      if (org2ddl.options[i].value == "DDL 2 Test 1") 
      { 
       org2ddl.options[i].disabled = "disabled"; 
       break; 
      } 
     } 
    }; 
</script> 
0
protected void ddlFirst_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     foreach (ListItem item in ddlSecond.Items) 
     { 
      if (item.ToString() == ddlFirst.SelectedValue) 
      { 
       item.Attributes.Add("disabled", "disabled"); 
      } 
     } 
    } 
    protected void ddlSecond_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     foreach (ListItem item in ddlFirst.Items) 
     { 
      if (item.ToString() == ddlSecond.SelectedValue) 
      { 
       item.Attributes.Add("disabled", "disabled"); 
      } 
     } 
    } 

Ma io ancora credono che questo sia lato client cosa

+0

Credo che alla fine il suo lato client in entrambi i casi quando si disattiva nulla – brykneval

+0

In realtà un sacco di controlli che è possibile abilitare o disabilitare dal lato server. Ad esempio 'LinkButton.Enabled = False' aggiungerà l'attributo' disabled' all'elemento 'a' risultante. Non sapevo che avresti potuto farlo per gli elementi 'option' però. – pseudocoder

0

Il DropDownList contiene una raccolta di oggetti ListItem, che hanno la proprietà Enabled si sta cercando di impostare. Questa proprietà funziona per ListItems nei controlli RadioButtonList o CheckBoxList, ma NON DropDownList. riferimento

MSDN: http://msdn.microsoft.com/en-us/library/vstudio/system.web.ui.webcontrols.listitem.enabled(v=vs.100).aspx

"Nota: Non è possibile utilizzare questa proprietà per disabilitare un controllo ListItem in un controllo DropDownList o controllo ListBox"

Edit: risposte sopra risolvono il problema, come hai descritto, e ho imparato qualcosa di nuovo :)

-1

ho pensato che vorrei aggiungere qui.

Due cose che abbiamo dimenticato di aggiungere:

EnableViewState = "True" AutoPostBack = "True"

Se non si aggiungono quelli per il controllo, l'evento non è sparato.

5

Per qualche ragione, questo ha funzionato per me:

if (ddlState.SelectedValue == "AK") 
    { 
     MyDdl.Items.FindByValue("1111111").Enabled = false; 

}

+0

Funziona anche per me. Grazie –