C# - Web kontrolban lévő Button lenyomásának eseménye és TextBox adatának kiolvasása

PostBack kezelése 4. rész

forráskód letöltése
Sorozatunk utolsó részében egy összetett feladatot oldunk meg, mely valós alkalmazásoknál nagyon gyakori feladat. Készítünk egy web kontrolt, melyben van adatbeviteli eszköz (TextBox) és nyomógomb (Button) is. Ekkor a kontrolnak saját magának kezelnie kell a gombra történő kattintás eseményét és a TextBox-ba írt adat esetleges változását is.
Mellékelt példa megnyitása előtt szükséges egy PostBack04 nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mellékelt mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
Szükségünk lesz két int típusú property-re. Az egyik Step néven számlálja majd, hogy hányszor kattintott a felhasználó a nyomógombra. A másik Value néven a TextBox-ba írt szám értékét tárolja. Mind a két property-t úgy kell megoldanunk, hogy az aktuális értékük megőrződjön két web hívás között. Ehhez a ViewState objektumot használhatjuk fel. Itt tároljuk el Step, illetve Value néven az adott értékeket és innen is olvassuk ki azokat. Így minden felhasználónk minden objektumának aktuális értéke megmarad.
    public int Step
    {
      get 
      {
        object obj = ViewState["Step"];
        return (obj == null) ? 0 : (int)obj;
      }
      set 
      { 
        ViewState["Step"] = value;
      }                  
    }
A kontrol tartalmát a Render függvényben hozzuk létre.
    protected override void Render(HtmlTextWriter output)
    {
      ...
A TextBox létrehozásánál adjunk annak egy egyedi azonosítót. Ehhez felhasználjuk a kontrolunk egyedi azonosítóját, melyet az UniqueID property-ből olvashatunk ki és ehhez még hozzátesszük a _multipleValue sztringet.
      TextBox tb = new TextBox();
      tb.Text = Value.ToString();
      tb.ID = UniqueID + "_multipleValue";
      tb.Style.Add("left", "10");
      tb.Style.Add("top", "30");
      tb.Style.Add("position", "absolute");
Fontos, hogy a gomb azonosítója megegyezzen a kontrolunk azonosítójával.
      Button b = new Button();
      b.ID = UniqueID;
      b.Text = "Tovább";
      ...
      p.Controls.Add(l);
      p.Controls.Add(tb);
      p.Controls.Add(b);
      RenderBeginTag(output);
      p.RenderControl(output);
      RenderEndTag(output);
    }
Most már csak kezelnünk kell a LoadPostData függvényt. Amikor ez fut, akkor biztosak lehetünk abban, hogy a kontrolunkban lévő nyomógombon történt a kattintás. Ekkor a paraméterként kapott postCollection-ből kiolvashatjuk a TextBox-unk aktuális értékét. Ehhez csak annak azonosítóját kell megadnunk, melyet a paraméterként kapott postDataKey és ismét a _multipleValue sztringből rakunk össze.
    public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
      Value = Convert.ToInt32(postCollection[postDataKey+"_multipleValue"]) * 2;
      Step++;
      return false;
    }

PostBack kezelése cikksorozat