2008-11-23 5 views
5

(Blättern Sie nach unten der Post nach unten Lösung zu finden.)DropdownList.selectedIndex immer 0 (ja, ich habe! IsPostBack)

Haben Sie eine asp.net Seite, die eine Datenliste enthält. Innerhalb dieses Datenelements ist eine Vorlage, die eine Dropdown-Liste enthält, und jedes Mal, wenn der Datengeber mit einem Element gefüllt wird, wird ein ItemCreatedCommand aufgerufen. Die itemCreatedCommand ist verantwortlich für Datenbindung der Dropdown-Liste.

ich glaube, das Problem liegt hier, dass ich ItemCreatedCommand zu bevölkert es bin mit - aber die seltsamen Dinge ist, dass wenn ich die Farbe „grün“ wählen, die Seite Autopostback, und ich werde sehen dass die Drop-Down nach wie vor auf der Farbe grün ist, aber wenn man versucht, zu verwenden, es ist SelectedIndex, habe ich immer 0 ...

protected void DataListProducts_ItemCreatedCommand(object 
    source, DataListItemEventArgs e) 

var itemId = (String)DataListProducts.DataKeys[e.Item.ItemIndex]; 
var item = itemBLL.GetFullItem(itemId); 

var DropDownListColor = (DropDownList)e.Item.FindControl("DropDownListColor"); 

//Also tried with : 
//if(!isPostBack) { 

DropDownListColor.DataSource = item.ColorList; 
DropDownList.Color.Databind(); 

// } End !isPostBack) 

    Label1.test = DropDownListColor.SelectedIndex.toString(); 
// <- THIS IS ALWAYS 0! *grr* 

ich den Code ein bisschen für Betrachtungs verengt haben, aber immer noch kann sehen, was Ich versuche es ing zu tun :) Der Grund für warum mache ich das, und nicht die Datenquelle für die Farben direkt ich Aspx-Seite zu deklarieren, ist, dass ich einen Test ausführen muss, wenn (showColors), aber ich nicht will die HTML-Seite mit Code überfluten, die ich in dem Code hinter-Datei fühlen sollte.

EDIT: Nach dem Versuch SelectedIndexChange zu ändern - ich bin jetzt in meinem Kopf eine „logische“ Verwirrung mit - wie kann ich Elemente innerhalb des Datenliste ändern? Da, soweit ich weiß - ich habe keine Möglichkeit zu überprüfen, welche von die Artikel in der Datenliste diese besondere Dropdownliste gehört zu ... Oder? Ich werde ein paar Möglichkeiten ausprobieren und sehen, was ich am Ende mit;) Aber tun bitte posten Sie Ihre Meinung zu diesem Frage :)

LÖSUNG:

Entweder Blase das Ereignis ItemCommand oder Behandeln Sie das Ereignis, erhalten die Absender Eltern (die eine DataListItem ist und Elemente manipulieren drin.

protected void DropDownListColor_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      DropDownList dropDownListColor = (DropDownList)sender; 
      DataListItem dataListItem = (DataListItem)dropDownListColor.Parent; 

      var item = items[dataListItem.ItemIndex]; 
      var color = item.ItemColor[dropDownListColor.SelectedIndex]; 

      var LabelPrice = (Label)dataListItem.FindControl("LabelPrice"); 
      LabelPrice.Text = color.Price; 
     } 
+0

Können Sie mehr auf den Grund klären für nicht hinzufügen es auf die Seite bringen? Ich bin mir nicht sicher, ob ich das richtig verstehe. Sie sagen, Sie wollen nicht die ASPX/HTML-Dateien durcheinander bringen, aber ich sehe keinen Grund, warum das DropDown etwas anders bindet. –

+0

Nun, um ehrlich zu sein denke ich, dass ich die "nicht-durcheinander-die-html" -Datei aufgeben werde, da ich stundenlang herumgesucht habe und es scheint, als ob es keine einfache Implementierung dessen gibt, was ich brauche. Der Grund war jedoch, eine strenge Code- und Designspalte einzuhalten. (Jetzt muss ich noch ein if-check ins aspx) –

Antwort

8

Wenn das Datalist-Daten gebunden ist, hat die Autopostback noch nicht behandelt worden, dh die Werte in der ItemCreated-Ereignis ist stil l die ursprünglichen Werte.

Sie müssen das SelectedIndexChange-Ereignis des Dropdown-Steuerelements behandeln.

+0

Ah - danke;) Ich versuch das :) –

0

Bezüglich Ihrer zweiten Frage:

Ich schlage vor, Sie die Autopostback aus der Dropdown entfernen, eine Schaltfläche „Aktualisieren“, hinzufügen und die Daten in der Schaltfläche Click-Ereignis aktualisieren.

Die Schaltfläche kann Command- und CommandArgument-Werte enthalten, sodass die Zuordnung zu einem Datenbankdatensatz erleichtert wird.

+0

Aber dann müsste man manuell auf den Button drücken um die Dropdownliste zu besetzen - da habe ich eigentlich zwei Dropdown-Listen, die voneinander abhängig sind, so muss ich zuerst eine auffüllen, und basierend auf der ersten, muss ich die zweite auffüllen. –

0

Vielen Dank für Ihre Lösung sprudeln

protected void ddlOnSelectedIndexChanged(object sender, EventArgs e) { 
    try { 
     ModalPopupExtender1.Show(); 
     if (ViewState["Colors"] != null) { 
      FillColors(ViewState["Colors"].ToString()); 
     } 

     DropDownList dropDownListColor = (DropDownList)sender; 
     DataListItem dataListItem = (DataListItem)dropDownListColor.Parent; 

     Image image = (Image)dataListItem.FindControl("mdlImage"); 
     Label ProductCode = (Label)dataListItem.FindControl("lblprdCode"); 
     Label ProductName = (Label)dataListItem.FindControl("lblProdName"); 
     DropDownList ddlQuantity = (DropDownList)dataListItem.FindControl("ddlQuantity"); 
     Label ProductPrice = (Label)dataListItem.FindControl("lblProdPrice"); 
     Label TotalPrice = (Label)dataListItem.FindControl("lblTotPrice"); 
     //Label ProductPrice = (Label)dataListItem.FindControl("lblProdPrice"); 
    } catch (Exception ex) { 

    } 
}