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