none
Postbacks und SelectedValue RRS feed

  • 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();

    }
    Donnerstag, 6. August 2009 10:00

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
    Donnerstag, 6. August 2009 11:53
  • 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
    Donnerstag, 6. August 2009 12:57

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
    Donnerstag, 6. August 2009 11:53
  • Hallo Peter,

    vielen Dank für die schnelle Antwort, es hat wunderbar funktioniert ;)

    Warum benötige ich diesen Eventhandler (ohne geht ja auch)?

    >>> ddlTest.SelectedIndexChanged += ddlTest_SelectedIndexChanged; <<<

    Gruss
    Adib


    Donnerstag, 6. August 2009 12:36
  • 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
    Donnerstag, 6. August 2009 12:57
  • Hallo Peter,

    so ausführliche Antworten habe ich nicht erwartet. Finde ich super....

    Dieses Forum hat mich positiv überrascht.

    Viele Grüße
    Adib
    Dienstag, 11. August 2009 08:40