C# - Törlés megerősítése dialóg ablak ASP.NET-es alkalmazás esetén

forráskód letöltése
Amikor lehetőséget biztosítunk a felhasználóink számára, hogy web oldalon keresztül töröljenek adatokat egy tetszőleges adathalmazból, akkor célszerű megerősíteni a törlési szándékot, mielőtt a kérést végrehajtjuk. Ekkor viszont sok felesleges időt venne igénybe, ha egy újabb web oldalon kérnénk a törlési szándék megerősítését, mivel ekkor szerverünkhöz kell ismét fordulni. Sokkal célszerűbb megoldás ilyenkor a kliens oldalon megjeleníteni egy kis dialóg ablakot, melyben rákérdezünk a törlési szándékra, ha a válasz most is a törlés, akkor küldjük csak el szerverünk felé ezt a kérést.
Mellékelt példa megnyitása előtt szükséges egy AskDelete nevű virtuális könyvtár létrehozása, mely a mellékelt 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.
Első lépésként készítsünk egy adathalmazt, melynél biztosíthatjuk a törlési lehetőséget. Ehhez a Page osztály Load eseményénél létrehozunk egy DataTable osztályt, melyet feltöltünk adatokkal és a Cache-re helyezzük, hogy a következő kérés esetén még a létrehozással se kelljen foglalkoznunk. Az adatokat a WebForm-on lévő DataGrid-hez kötjük, majd felveszünk egy új oszlopot, melyben linkek kerülnek elhelyezésre. Ezekkel a linkekkel lehet majd törölni az adathalmaz egyes sorait. Ezt az oszlopot a következőképpen készíthetjük el: válasszuk ki a DataGrid1 kontrolt, majd a ToolBox alján lévő Property Builder... linkre kattintva a megjelenő ablak Columns lapján keressük elő az Avaliable columns elemei közül a Button Column - Delete tételt. Ebből egyet mozgassunk át a Selected columns listába. A Text mezőbe írjuk be azt a szót, hogy „Törlés”, ez jelenik meg a link felirataként. A Button type legyen LinkButton. Ez garantálja, hogy az oszlop egyes celláiban egy-egy link jelenik meg, mely képes lesz arra, hogy az adott sorra egy-egy törlési utasítást küldjön.
Ha most futtatnánk a programot és megtekintenénk a generált HTML kódot, akkor az alábbit látnánk minden link esetén:
<a href="javascript:__doPostBack('DataGrid1:_ctl2:_ctl0','')" style="color:Black;">Törlés</a> 
A törlési szándék megerősítéseként akkor kell a dialóg ablakot megjeleníteni, amikor a felhasználó e linkek valamelyikére kattint. Ehhez úgy kellene módosítani a fenti HTML kódot, hogy az onclick eseményt mi magunk tudjuk lekezelni. A problémánk viszont az, hogy ezt a HTML kódot a DataGrid generálja és nem mi. Szerencsére azért van lehetőségünk arra, hogy a DataGrid által generált forráskódba belenyúljunk menet közben.
Ehhez használjuk fel az ItemCreated eseményét a DataGrid-nek. Ez minden olyan esetben létrejön, mikor egy-egy sorát létrehozta a DataGrid.
    private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
    {
      try
      {
Tudjuk azt, hogy a DataGrid első oszlopába kerül a linkünk, mely nem más lesz, mint egy LinkButton típusú kontrol. Az esemény „e” paraméterén keresztül elérhetjük az aktuálisan generált sor celláit, vagy akár a bennük lévő kontrolokat is. Ehhez az Item property-n keresztül vezet az út. A cellák kollekcióját a Cells property tartalmazza, majd a cellában lévő kontrolokat a Controls property-ben találjuk. Ezzel a módszerrel tehát elérhetjük a cellában lévő LinkButton kontrolt, melynél két dolgot kell beállítanunk.
        LinkButton lb = (LinkButton) e.Item.Cells[0].Controls[0];
Az első ilyen az egy paraméter lesz, melyet a CommandArgument property-jében adunk meg. Ez nem más, mint az adott sor DataGrid-beli sorszáma. Ez majd ahhoz kell, hogy a törlésnél tudomásunk legyen arról, hogy melyik sort kell törölnünk.
        lb.CommandArgument = e.Item.ItemIndex.ToString();
A második tennivaló pedig nem más, mint az onclick esemény kezelésének megoldása a linken. Ehhez egy új attribútumot kell megadnunk, melynek neve onclick, értéke pedig a "return confirm (\"Biztosan törli?\");" sztring lesz, melynek a következő lesz a hatása: amikor a felhasználó kattint valamely linken, akkor megjelenik egy kis dialóg ablak, benne a „Biztosan törli?” felirattal és OK valamint Mégsem nyomógombokkal. Ha a felhasználó a Mégsem gombot választja, akkor ezzel azt éri el, hogy a linkre történt kattintás érvénytelen lesz, így nem kerül újabb kérés küldése a szerverünkön futó alkalmazás felé és így nyilván a törlés sem valósul meg. Az OK gomb esetén persze létrejön a törlés kérése.
        lb.Attributes.Add("onclick", "return confirm (\"Biztosan törli?\");");
      }
      catch
      {
      }
    }    
Ha most futtatjuk a programot és megnézzük a HTML kódot, akkor láthatjuk, hogy a link kódja annyiban változott, hogy bekerült az onclick esemény és annak kezelése.
<a onclick="return confirm ("Biztosan törli?");" href="javascript:__doPostBack('DataGrid1:_ctl2:_ctl0','')" style="color:Black;">Törlés</a>
Amikor megérkezik a programunkhoz a törlés kérése, akkor jön létre a DataGrid ItemCommand eseménye. Ekkor meghatározzuk, hogy mennyi a tárolt CommandArgument értéke és töröljük ezt a sort az adathalmazból.
    private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {
      dt.Rows.RemoveAt(Convert.ToInt32(e.CommandArgument));
      Cache["DataTable"]=dt;
      DataGrid1.DataSource = dt.DefaultView;
      DataGrid1.DataBind();
    }