4 Stimmen

DropDownList Ärgernis: gleicher Wert löst kein Ereignis aus

Ich habe ein Dropdownlisten-Steuerelement mit verschiedenen Texteigenschaften gefüllt, aber jeder Text Eigenschaften hatte den gleichen Wert (Texteigenschaft war A, Wert Eigenschaften ist blah, Texteigenschaft war B, Wert Eigenschaften ist blahblah, etc... )

ASP.net prüft Werteigenschaften nur beim Postback und da ALLE Werte gleich waren (aus Grund testen) dieses kleine lästige Verhalten passiert. Gibt es ein Workaround? Bedeutet dies, dass Sie nicht nie den Wert gleich sein können?

8voto

Rob Cooper Punkte 28132

Das klingt, als ob Sie an der falschen Veranstaltung arbeiten. Versuchen Sie SelectedIndexChanged .

Stellen Sie sicher, dass Sie auch die AutoPostBack Eigenschaft eingestellt auf True .

Aufgelöst

OK, ich habe also nachgeforscht, weil ich neugierig war :)

Es gibt ein "Problem" bei der Datenbindung mit nicht eindeutigen Werten.

Deshalb entschuldige ich mich öffentlich dafür, dass ich etwas anderes gesagt habe.

Zum Reproduzieren:

ASPX

    <asp:DropDownList ID="myDDL" runat="server" AutoPostBack="True">
    </asp:DropDownList>
    <asp:Label ID="lblSelItem" runat="server"Text="Currently Selected Item: 0"></asp:Label>
    <asp:Label ID="lblSelVal" runat="server" Text="Currently Selected Value: X"></asp:Label>

Code-Behind

    List<string> MyData()
    {
        List<string> rtn = new List<string>();
        rtn.Add("I am the same value!");
        rtn.Add("I am the same value!");
        rtn.Add("I am the same value!");
        rtn.Add("I am the same value!2");
        return rtn;
    }

    protected void Page_Init()
    {
        if (!Page.IsPostBack)
        {
            // Load the Data for the DDL.
            myDDL.DataSource = MyData();
            myDDL.DataBind();
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Display the Currently Selected Item/Value.
        lblSelItem.Text = "Currently Selected Item: " + myDDL.SelectedIndex.ToString();
        lblSelVal.Text = "Currently Selected Value: " + myDDL.SelectedValue;
    }

Ausführen und dabei die Werte in der DropDownList ändern. Beachten Sie, dass ein PostBack nicht erfolgt.

Als ich mir den Quelltext ansah, wurde mir klar, dass wir den "" explizit setzen müssen. value " Attribut für die <option> Elemente, die von der Server-Steuerung erzeugt werden, was mich dazu brachte, etwas wie folgt zu tun:

Neuer Code-Behind

    Dictionary<string, string> MyTwoColData()
    {
        Dictionary<string, string> rtn = new Dictionary<string, string>();
        rtn.Add("1", "I am the same value!");
        rtn.Add("2", "I am the same value!");
        rtn.Add("3", "I am the same value!");
        return rtn;
    }

    protected void Page_Init()
    {
        if (!Page.IsPostBack)
        {
            // Load the Data for the DDL.
            Dictionary<string, string> data = MyTwoColData();

            foreach (KeyValuePair<string, string> pair in MyTwoColData())
            {
                myDDL.Items.Add(new ListItem(pair.Value, pair.Key));
            }

            myDDL.DataBind();
        }
    }

Dadurch werden die Werte explizit auf "1", "2", "3" usw. gesetzt, so dass sie eindeutig sind, aber dennoch die richtigen Daten in der Liste angezeigt werden.

Natürlich können Sie dies ändern, um mit einspaltigen Listen zu arbeiten, aber einfach durch eine for-Schleife laufen und den Wert von i oder so ähnlich.

Was gute Workarounds mit DataSets angeht, bin ich mir nicht sicher.

Würden wir dem Benutzer realistischerweise eine Liste von Optionen mit genau denselben Werten präsentieren?

Ich persönlich glaube nicht, und das ist wahrscheinlich der Grund, warum dieses "Problem" nicht angegangen wurde :)

Viel Spaß!

PS:

Oh, ich sollte noch hinzufügen, wenn Sie den Textwert in der "Korrektur" verwenden wollen, ändern Sie ihn in SelectedItem statt SelectedValue .

6voto

Joseph Anderson Punkte 2828

ASP.NET kann nicht zwischen verschiedenen Elementen mit denselben Werten in der Auswahlliste unterscheiden, da der Browser beim Senden des HTTP POST nur den ausgewählten Wert sendet.

ASP.NET findet das ERSTE Element in der Dropdown-Liste mit einem passenden Wert.

Sie müssen sicherstellen, dass jedes Element in der Auswahlliste einen eigenen Wert hat. Sie können dies tun, indem Sie jedem Wert einen Schlüssel hinzufügen. Mit anderen Worten, anstatt "blah" für jeden Wert zu verwenden, würden Sie "blah-1", "blah-2" usw. verwenden.

0voto

TGnat Punkte 3821

Das Problem ist, dass, wenn sich der ausgewählte Index nicht ändert, das Postback nicht ausgelöst wird. In dem Fall, in dem der Benutzer die gleiche Auswahl trifft, ändert sich der ausgewählte Index nicht.

Es tut mir leid, dass dies keine Antwort auf die Frage ist, aber es erklärt das Verhalten, soweit ich weiß.

0voto

Jack Punkte 9605

Die SelectedIndexChanged wird nicht einmal auslösen, weil alle listitem Wert in der Dropdownliste Steuerung die gleichen sind. Ich habe etwas gegoogelt. Es scheint, wie dies ist das gemeinsame Problem. Ich habe keine Arbeit rund um noch gefunden.

0voto

JasonS Punkte 22820

Sie könnten Werte wie diese verwenden:

1:2

2:2

3:2

Dabei ist die zweite Zahl der "echte" Wert. Dann sollte Ihr Ereignis auslösen und Sie können den "echten" Wert in Ihrem Code dahinter analysieren.

Warum haben Sie eine Auswahlliste, in der alle Werte gleich sind? Oder sind nur einige von ihnen gleich?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X