Förbättra kodöverblicken i RowDataBound (GridView)

författad av Kauppi 2009-05-11 15:32

Jag gillar inte användningen av BoundFields i GridView eftersom det kräver hårdkodning av property-namnen vilket försvårar förvaltning av applikationen. Skulle man tex byta namn på en property så kommer det inte smälla vid kompilering om man använder sig av BoundFields. Detta är alltså inte önskvärt:

<asp:BoundField DataField="FullName" />

En bättre lösningen är att använda sig av TemplateFields men en klassisk användning av detta ökar kodmängden en del i RowDataBound. Ett exempel:

protected void GridViewX_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        Order order = (Order)e.Row.DataItem;

        Label label = (Label)e.Row.FindControl("LabelX");
        if (label != null)
        {
            label.Text = order.X;
        }

        label = (Label)e.Row.FindControl("LabelY");
        if (label != null)
        {
            label.Text = order.Y;
        }

        label = (Label)e.Row.FindControl("LabelZ");
        if (label != null)
        {
            label.Text = order.Z;
        }
    }
}

Förvaltningen av applikationen underlättas lite med hjälp av TemplateFields men det är en del dublicering av kod och kodöverblicken är inte optimal. En bättre lösning är följande:

protected void GridViewX_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    GridViewRowEventArgsCustom eArgs = new GridViewRowEventArgsCustom(e.Row);
    if (eArgs.IsDataRow)
    {
        Order order = (Order)eArgs.Row.DataItem;

        eArgs.SetValue("LabelX", order.X);
        eArgs.SetValue("LabelY", order.Y);
        eArgs.SetValue("LabelZ", order.Z);
    }
}

I detta exemplet har jag skapat en GridViewRowCustom som ärver från GridViewRow. I den nya klassen hittar vi den nya metoden SetValue för att enkelt sätta värdet på tex en label. Genom att använda SetValue-metoden slipper man fem rader kod. I GridViewRowCustom har jag också lagt till properties som anger om raden är en header, datarow eller footer (ex row.IsDataRow istället för e.Row.RowType == DataControlRowType.DataRow).

Här kan du ladda hem GridViewRowCustom-klassen: GridViewRowEventArgsCustom.txt (1,30 kb)

Hör gärna av dig om du gör eller kommer på några förbättringar i området.

Powered by BlogEngine.NET 1.4.5.0