Benutzer mit den meisten Antworten
Postbacks und SelectedValue

Frage
-
Hallo,
ich möchte eine ListBox aus z.B. eine Hashtable mit Namen füllen. Wenn ich einen Namen auswähle, möchte ich im TextBox die Emailadresse ausgeben.
Mein Problem ist, dass der Wert(Emailadresse) nicht ausgegen wird. Ich muss "If(!IsPostBack)" auskommentieren, dann gehts, aber meine ListBox fügt nach jedem PostBack die komplette Tabelle hinzu.
Vielen Dank im Voraus
Adib
----------------------------------
Hier mein Code:
public partial class _Default : System.Web.UI.Page
{
Hashtable myTable = new Hashtable();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
myTable.Add("Name1", "name1@email.de");
myTable.Add("Name2", "name2@email.de");
myTable.Add("Name3", "name3@email.de");
myTable.Add("Name4", "name4@email.de");
foreach (DictionaryEntry name in myTable)
{
ListBox1.Items.Add(name.Key.ToString());
}
}
}
protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
TextBox1.Text = myTable[ListBox1.SelectedValue].ToString();
}
Antworten
-
Hallo Adib9
Das ist klar :)
Beim SelectedIndexChanged Eventhandler (Passiert wenn IsPostBack == true) beziehst du
dich auf deine Hashtable, die du eben dann nicht mehr befüllst.
Nach jedem neuen Seitenaufruf oder Postback ist alles null und wird neu erstellt.
Also, entweder das Füllen der HashTable immer machen, oder gleich richtig,
mit einem Dictionary, das die Eigenschaften Key und Value hat, die du per DataBinding viel einfacher an dein
Control anhängen kannst:
protected void Page_Load(object sender, EventArgs e) { Dictionary<string, string> dic = new Dictionary<string, string> { {"Person2", "person2@email.de"}, {"Person1", "person1@email.de"} }; ddlTest.DataSource = dic; ddlTest.DataTextField = "Key"; ddlTest.DataValueField = "Value"; if (!this.IsPostBack) { ddlTest.DataBind(); } ddlTest.SelectedIndexChanged += ddlTest_SelectedIndexChanged; } void ddlTest_SelectedIndexChanged(object sender, EventArgs e) { txtEmail.Text = ddlTest.SelectedValue; }
HTH
Gruss Peter
MVP - Visual Developer ASP / ASP.NET, Switzerland- Als Antwort markiert Robert BreitenhoferModerator Montag, 24. August 2009 14:22
-
Hallo Adlib
Es gibt bei ASP.NET mehrere Möglichkeiten:
1. AutoEventWireup (Eine Direktive der Page) kann dafür sorgen das entsprechend benannte
Methoden automatisch als Eventhandler registriert werden. (Gilt für die Page Eventhandler).
2. Eventhandler von Hand registrieren, wie ich das hier gemacht habe.
3. Methoden überschreiben (Wenn man einen Event innerhalb der Klasse behandeln will, die in wirft, bzw. in der vererbten Klasse.
Bspw. override OnLoad(object sender, EventArgs e) { ... }
4. Bei Controls kannst du im ASPX-Code, also dem Markup den Handler angeben, dann übernimmt ASP.NET auch dessen Anwendung.
Ich benutze persönlich nur die manuelle Bindung, weil ich dann genau was, wann und wie funktioniert.
Jetzt bist du bestimmt verwirrt ;-) und das ist mitunter auch ein Grund wieso ich das nicht so toll finde.
Gruss Peter
MVP - Visual Developer ASP / ASP.NET, Switzerland- Als Antwort vorgeschlagen Peter Bucher Freitag, 14. August 2009 19:12
- Als Antwort markiert Robert BreitenhoferModerator Montag, 24. August 2009 14:21
Alle Antworten
-
Hallo Adib9
Das ist klar :)
Beim SelectedIndexChanged Eventhandler (Passiert wenn IsPostBack == true) beziehst du
dich auf deine Hashtable, die du eben dann nicht mehr befüllst.
Nach jedem neuen Seitenaufruf oder Postback ist alles null und wird neu erstellt.
Also, entweder das Füllen der HashTable immer machen, oder gleich richtig,
mit einem Dictionary, das die Eigenschaften Key und Value hat, die du per DataBinding viel einfacher an dein
Control anhängen kannst:
protected void Page_Load(object sender, EventArgs e) { Dictionary<string, string> dic = new Dictionary<string, string> { {"Person2", "person2@email.de"}, {"Person1", "person1@email.de"} }; ddlTest.DataSource = dic; ddlTest.DataTextField = "Key"; ddlTest.DataValueField = "Value"; if (!this.IsPostBack) { ddlTest.DataBind(); } ddlTest.SelectedIndexChanged += ddlTest_SelectedIndexChanged; } void ddlTest_SelectedIndexChanged(object sender, EventArgs e) { txtEmail.Text = ddlTest.SelectedValue; }
HTH
Gruss Peter
MVP - Visual Developer ASP / ASP.NET, Switzerland- Als Antwort markiert Robert BreitenhoferModerator Montag, 24. August 2009 14:22
-
Hallo Adlib
Es gibt bei ASP.NET mehrere Möglichkeiten:
1. AutoEventWireup (Eine Direktive der Page) kann dafür sorgen das entsprechend benannte
Methoden automatisch als Eventhandler registriert werden. (Gilt für die Page Eventhandler).
2. Eventhandler von Hand registrieren, wie ich das hier gemacht habe.
3. Methoden überschreiben (Wenn man einen Event innerhalb der Klasse behandeln will, die in wirft, bzw. in der vererbten Klasse.
Bspw. override OnLoad(object sender, EventArgs e) { ... }
4. Bei Controls kannst du im ASPX-Code, also dem Markup den Handler angeben, dann übernimmt ASP.NET auch dessen Anwendung.
Ich benutze persönlich nur die manuelle Bindung, weil ich dann genau was, wann und wie funktioniert.
Jetzt bist du bestimmt verwirrt ;-) und das ist mitunter auch ein Grund wieso ich das nicht so toll finde.
Gruss Peter
MVP - Visual Developer ASP / ASP.NET, Switzerland- Als Antwort vorgeschlagen Peter Bucher Freitag, 14. August 2009 19:12
- Als Antwort markiert Robert BreitenhoferModerator Montag, 24. August 2009 14:21