Pulire un pannello di ricerca
Sfruttando gli extension methods (già incontrati nel nostro blog) vediamo come pulire un pannello di ricerca di una pagina ASP.NET Web Forms. Questa è una situazione che può capitare numerose volte e rappresenta una lavoro noioso e ripetitivo e quindi particolarmente soggetto ad errori.
Supponiamo di aver racchiuso tutti i nostri controlli all'interno di un pannello
<asp:Panel runat="server" ID="PanelCerca"> <asp:TextBox runat="server" ID="TextBoxTest"></asp:TextBox> <asp:DropDownList runat="server" ID="DropDownTest"></asp:DropDownList> <asp:CheckBox runat="server" ID="CheckBoxTest" /> </asp:Panel>
Per pulire i tre diversi controlli potremmo scrivere controllo per controllo:
TextBoxTest.Text = ""; DropDownTest.ClearSelection(); CheckBoxTest.Checked = false;
Sembra un lavoro semplice e veloce ma se i controlli sono 20? e se viene aggiunto un filtro, ci ricorderemo di pulirlo?
Con due semplici extension methods risolviamo una volta per tutte i nostri problemi. Il metodo GetAllControls() recupera tutti i controlli figli del controllo su cui è chiamato in maniera ricorsiva, utile nel caso in cui la struttura del pannello è nidificata non serve nel nostro esempio. Il metodo Pulisci() scorre tutti i controlli figli del controllo su cui è chiamato ed esegue azioni specifiche per pulire ogni tipo di controllo.
public static class extension { public static void Pulisci(this WebControl control) { if (control == null) throw new NullReferenceException("control is null"); foreach (Control item in control.GetAllControls()) { if (item is TextBox) ((TextBox)item).Text = ""; else if (item is DropDownList) ((DropDownList)item).ClearSelection(); else if (item is CheckBox) ((CheckBox)item).Checked = false; else if (item is CheckBoxList) ((CheckBoxList)item).ClearSelection(); else if (item is GridView) ((GridView)item).SelectedIndex = -1; else if (item is HtmlInputText) ((HtmlInputText)item).Value = ""; } } public static IEnumerable<Control> GetAllControls(this Control parent) { if (parent == null) throw new NullReferenceException("parent is null"); foreach (System.Web.UI.Control control in parent.Controls) { yield return control; foreach (System.Web.UI.Control descendant in GetAllControls(control)) { yield return descendant; } } } }
Dopo aver aggiunto questi metodi al nostro progetto per pulire questo e qualunque altro pannello basterà fare:
PanelCerca.Pulisci();
Ovviamente per gestire più tipologie di controlli (anche custom!) basterà inserire il relativo codice nel metodo pulisci.
comments powered by Disqus