2010-12-01 4 views
4

Okay, also ich habe ein DropDownList-Steuerelement, das 50 ListItems enthält, eine für jeden der 50 Zustände. Der Textwert gibt jeden Statusnamen wieder, der jeden Textwert eindeutig macht. Die Werteigenschaft jedes Listenelements enthält jedoch die aktuelle Steuerrate dieses Status, was bedeutet, dass einige der Werte nicht eindeutig sind. Postbacks auf diesem Steuerelement ändern ständig den ausgewählten Artikel. Gibt es dafür eine Arbeit?DropDownList mit den nicht eindeutigen Werten verschraubt viewstate/postbacks

Kopieren Sie zum Kopieren den folgenden Code in ein neues Webformular. Es ist nur eine einfache DropDownList. Versuchen Sie, verschiedene Zustände auszuwählen. Einige von ihnen bleiben, andere nicht. Versuchen Sie zum Beispiel, "Idaho" als Staat auszuwählen; es kehrt aus irgendeinem Grund nach Arkansas zurück. Dies geschieht, bevor das OnSelectedIndexChanged-Ereignis ausgelöst wird, denn wenn ich "Idaho" wähle und dann das ausgewählte Element in der Ereignismethode beim Postback lese, ist das ausgewählte Element Arkansas! Sehr nervig.

  State:<br /> 
      <asp:DropDownList BorderWidth="3px" AutoPostBack="true" BackColor="#ffffcc" ID="ddlBillingState" 
       runat="server"> 
       <asp:ListItem Value="0" Text="Not Specified"></asp:ListItem> 
       <asp:ListItem Value="4" Text="Alabama"></asp:ListItem> 
       <asp:ListItem Value="0" Text="Alaska"></asp:ListItem> 
       <asp:ListItem Value="5.6" Text="Arizona"></asp:ListItem> 
       <asp:ListItem Value="6" Text="Arkansas"></asp:ListItem> 
       <asp:ListItem Value="8.25" Text="California"></asp:ListItem> 
       <asp:ListItem Value="2.9" Text="Colorado"></asp:ListItem> 
       <asp:ListItem Value="6" Text="Connecticut"></asp:ListItem> 
       <asp:ListItem Value="6" Text="District of Columbia"></asp:ListItem> 
       <asp:ListItem Value="0" Text="Delaware"></asp:ListItem> 
       <asp:ListItem Value="6" Text="Florida"></asp:ListItem> 
       <asp:ListItem Value="4" Text="Georgia"></asp:ListItem> 
       <asp:ListItem Value="4" Text="Hawaii"></asp:ListItem> 
       <asp:ListItem Value="6" Text="Idaho"></asp:ListItem> 
       <asp:ListItem Value="6.25" Text="Illinois"></asp:ListItem> 
       <asp:ListItem Value="7" Text="Indiana"></asp:ListItem> 
       <asp:ListItem Value="6" Text="Iowa"></asp:ListItem> 
       <asp:ListItem Value="5.3" Text="Kansas"></asp:ListItem> 
       <asp:ListItem Value="6" Text="Kentucky"></asp:ListItem> 
       <asp:ListItem Value="4" Text="Louisiana"></asp:ListItem> 
       <asp:ListItem Value="5" Text="Maine"></asp:ListItem> 
       <asp:ListItem Value="6" Text="Maryland"></asp:ListItem> 
       <asp:ListItem Value="6.25" Text="Massachusetts"></asp:ListItem> 
       <asp:ListItem Value="6" Text="Michigan"></asp:ListItem> 
       <asp:ListItem Value="6.875" Text="Minnesota"></asp:ListItem> 
       <asp:ListItem Value="7" Text="Mississippi"></asp:ListItem> 
       <asp:ListItem Value="4.225" Text="Missouri"></asp:ListItem> 
       <asp:ListItem Value="0" Text="Montana"></asp:ListItem> 
       <asp:ListItem Value="5.5" Text="Nebraska"></asp:ListItem> 
       <asp:ListItem Value="6.85" Text="Nevada"></asp:ListItem> 
       <asp:ListItem Value="0" Text="New Hampshire"></asp:ListItem> 
       <asp:ListItem Value="7" Text="New Jersey"></asp:ListItem> 
       <asp:ListItem Value="5" Text="New Mexico"></asp:ListItem> 
       <asp:ListItem Value="4" Text="New York"></asp:ListItem> 
       <asp:ListItem Value="5.75" Text="North Carolina"></asp:ListItem> 
       <asp:ListItem Value="5" Text="North Dakota"></asp:ListItem> 
       <asp:ListItem Value="5.5" Text="Ohio"></asp:ListItem> 
       <asp:ListItem Value="4.5" Text="Oklahoma"></asp:ListItem> 
       <asp:ListItem Value="0" Text="Oregon"></asp:ListItem> 
       <asp:ListItem Value="6" Text="Pennsylvania"></asp:ListItem> 
       <asp:ListItem Value="7" Text="Rhode Island"></asp:ListItem> 
       <asp:ListItem Value="6" Text="South Carolina"></asp:ListItem> 
       <asp:ListItem Value="4" Text="South Dakota"></asp:ListItem> 
       <asp:ListItem Value="7" Text="Tennessee"></asp:ListItem> 
       <asp:ListItem Value="6.25" Text="Texas"></asp:ListItem> 
       <asp:ListItem Value="4.7" Text="Utah"></asp:ListItem> 
       <asp:ListItem Value="6" Text="Vermont"></asp:ListItem> 
       <asp:ListItem Value="5.0" Text="Virginia"></asp:ListItem> 
       <asp:ListItem Value="6.5" Text="Washington"></asp:ListItem> 
       <asp:ListItem Value="6" Text="West Virginia"></asp:ListItem> 
       <asp:ListItem Value="5" Text="Wisconsin"></asp:ListItem> 
       <asp:ListItem Value="4" Text="Wyoming"></asp:ListItem> 
      </asp:DropDownList> 

ich auch Ansichtszustand versucht zu deaktivieren, OnSelectedIndexChanged dann würde ich den ausgewählten Index in Viewstate speichern [ „selectedIndex“] und auf Postbacks abrufen und die Dropdown-Liste neu zu besiedeln. Aber wie bereits gesagt, weil das ausgewählte Element einen anderen Wert hat als der beabsichtigte, bevor es überhaupt zum Ereignis gelangt, wurde nur der verschraubte Wert in meinem benutzerdefinierten Ansichtszustandsfeld gespeichert.

Antwort

5

Ich denke, Ihre Werte sollten eindeutig sein. Anstatt den Steuersatz als Wert anzugeben, geben Sie den Wert einfach als Staat an und verwenden Sie diesen Status, um Ihren Steuerwert zu erhalten. Als ein Beispiel, in Ihrem Code-Behind, könnten Sie eine Dictionary<string, decimal> taxTable haben, die Sie verwenden, um Ihre Werte zu erhalten. Wie

decimal taxRate = taxTable[yourDropDown.SelectedValue]; 
+0

Danke, das ist, was ich hatte Angst. Saugt, wenn es auf etwas hinausläuft, was einfach nicht möglich ist. Ich habe stundenlang versucht herauszufinden, wo der Viewstate geändert wurde, nur um herauszufinden, dass er nichts mit Viewstate zu tun hat. lol – Chev

+0

Ich gehe tatsächlich die extra Meile und baue eine Steuerdatenbanktabelle. Ich hätte das in erster Linie tun sollen, um Änderungen bei Steuersatzänderungen leicht zu ändern. Dies passiert beim Schneiden von Ecken: P – Chev

2

Warum können Sie den Steuersatz nicht von der Abkürzung des Bundesstaates oder so bekommen?

In Code hinter:

decimal taxRate = GetTaxRateFromState(ddlState.SelectedValue); 

ich das Drop-down vorstellen, nicht weiß, welcher Wert ist derjenige, der ursprünglich ausgewählt wurde und es setzt nur den ausgewählten Wert auf das erste Element, das den Wert hat, wurde geschrieben .

1

Hallo Chevex Leider gibt es keine Möglichkeit, einen nicht eindeutigen Wert für ListItem zu verwenden. Sie müssen eine eindeutige ID für jeden Steuersatz generieren und die ID als Wert anstelle des Steuersatzes verwenden.

1

Denken Sie an die „Value“ als Primärschlüssel, dass ASP.NET zu identifizieren verwendet, welches Element aus dem Dropdownlist ausgewählt ist. Wenn Sie das value -Attribut neu zuweisen, um etwas anderes zu speichern, ist das ausgewählte Element (in ViewState durch seinen Wert gespeichert) nicht länger eindeutig und kann nicht beibehalten werden. Wie andere bereits erwähnt haben, speichern Sie Ihren Steuersatz an einem anderen Ort und verwenden Sie den ausgewählten Status, um den Steuersatz zu ermitteln (außerhalb des DropDownList-Steuerelements selbst).

+1

Sinnvoll. Vielen Dank. Sie würden denken, dass das ListItem ein Feld namens ID oder etwas für diesen Zweck haben würde, aber gut. Ich habe tatsächlich zwei dieser Dropdowns, so dass es sinnvoller ist, die Steuerinformationen ohnehin in einer Datenbanktabelle zu speichern. Auf diese Weise können beide Dropdowns auf die eine Quelle zugreifen und die Daten können in Zukunft mit einem Steueraktualisierungstool geändert werden. Das wird mehr für das Schneiden lehren! : P – Chev

Verwandte Themen