Wie kann ich meine EditForm in asp.net bauen, wo zwei Dropdown-Listen voneinander abhängig sind?

StackOverflow https://stackoverflow.com/questions/1066238

  •  21-08-2019
  •  | 
  •  

Frage

ich habe ein kleines Problem, ich eine Bearbeitungsseite in meiner asp.net Anwendung erschaffe, wo die Benutzer Eigenschaften in einem Objekt bearbeiten. Ich habe zwei Dropdown-Menü (Kategorie und Gruppe), wobei die Menge der Gruppen auf der gewählten Kategorie abhängig ist. Mein Ziel ist es die richtige Kategorie og das Objekt anzuzeigen bearbeitet wird, dann die Liste der Gruppen zu laden und die richtige Gruppe wählen -. Problem ist, dass mein SelectedIndexChanged-Ereignis nie ausgelöst wird,

Wenn ich meine Kategorien in page_load laden und die Kategorien füllen Sie den Code wie folgt aussieht:

protected void Page_Load(object sender, EventArgs e)
    { string editid= Request["edit"] == null ? null : Request["edit"].ToString();
        int id = Convert.ToInt32(editid);
        if (link == null)
        {
            link = BLLink.Load(id, blm);
        }
        if (!IsPostBack)
        {
            group = BLGroup.Load(link.GroupId, blm);
            category = BLCategory.Load(group.CategoryId, blm);

            List<BLCategory> categories = BLCategory.LoadAll();
            categoryDropDown.DataSource = categories;
            categoryDropDown.DataTextField = "CategoryName";
            categoryDropDown.DataValueField = "id";
            categoryDropDown.SelectedValue = category.id.ToString(); //this one doesnt cause the event to fire??? Doesnt matter if it is called after the databind() method
            categoryDropDown.DataBind();
        }

}

TheEvent Handler Ich mag würde, wenn alle Gruppen auszuführen laden und die Drop-Down-bevölkern, und wählen Sie die richtige:

protected void categoryDropDown_SelectedIndexChanged(object sender, EventArgs e)
    {
        category = BLCategory.Load(Convert.ToInt32(categoryDropDown.SelectedValue), new TestModelDataContext());
        if (category != null)
        {
            List<BLGroup> groups = BLGroup.LoadAll(category.id);
            groupDropDown.DataSource = groups;
            groupDropDown.DataTextField = "GroupHeading";
            groupDropDown.DataValueField = "GroupId";
            groupDropDown.DataBind();
            if (group != null)
            {
                groupDropDown.SelectedValue = group.GroupId.ToString();
            }
            else
            {
                groupDropDown.SelectedIndex = 0;
            }
        }
    }

Ich weiß nicht, was falsch läuft, scheint dies wie eine einfache Sache zu tun, was mache ich falsch?

War es hilfreich?

Lösung

Um dieses Ereignis zu erhalten abzufeuern, muss die Seite Postbacks, wenn die Auswahl des Benutzers ändert. Dies wird die gesamte Seite führen zu aktualisieren (aber Kontrollen sollten ihren Zustand beibehalten).

Dieses SelectedIndexChanged Ereignis wird auf dem Server ausgeführt wird, und ich denke, dass es eine Eigenschaft auf dem ersten Drop-Down ist über die Einreichung / Postbacks, wenn das Element Änderungen auf sie ausgewählt.

clientseitige Verhalten zu erhalten, können Sie zwei Dinge tun:
1) Wickeln Sie diesen Abschnitt in einem Update und haben die zweite Liste aktualisieren, wenn die Wertänderungen des ersten
2) Laden der Werte JavaScript clientseitigen Code verwenden, das ausgelöst wird, wenn die ausgewählten Wertänderungen auf dem ersten, ruft die Liste und füllt die zweite
  2a) Sie können entweder einen Dienst schreiben, die den Anruf an die Datenquelle wickelt und gibt die Werte als JSON, etc. oder   2b) Sie können alle Werte für jede mögliche Wahl in verborgene Felder ausfüllen, die in irgendeiner Art und Weise durch die Werte in der ersten Box id'd sind (dies ist nicht wünschenswert, aber möglich ist, auf die Sicherheit und die Größe Ihrer Datensätze abhängig) .

Option 1 ist wahrscheinlich der einfachste Weg, um Ihre bestehende Code-Basis zu erhalten und noch clientseitige Verhalten bekommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top