środa, 8 sierpnia 2012

Indeks kolumny w GridView

Chcąc pobrać indeks kolumny w GridView (ASP.NET WebForms) możemy na trafić na problem, iż w GridView nie zaimplementowano takiej możliwości bezpośrednio.

Jeżeli korzystamy z kolumn, które są bindowane do pól obiektów, możemy posłużyć się właściwością DataField dla kolumny.
Problemem jest to, iż kolumny są typu DataControlField a typ ten nie zawiera właściwości DataField. Klasy dziedziczące po tym typie zawierają bądź też nie zawierają tej właściwości.
W tym przypadku możemy się posłużyć rzutowaniem, bądź też skorzystać z refleksji w celu zmniejszenia ilości warunków:

Code:
        <asp:GridView runat="server" DataSourceID="dsProducts" AutoGenerateColumns="False"
        ID="gvProducts">
            <Columns>
                <asp:BoundField DataField="ProductId" HeaderText="Id"/>
                <asp:BoundField DataField="Name" HeaderText="Nazwa"/>
                <asp:BoundField DataField="Size" HeaderText="Rozmiar"/>
                <asp:DataBoundFieldEx DataField="Weight" HeaderText="Waga" UniqeName="column" />
            </Columns>
        </asp:GridView>

Oraz metoda która pozwala wyciągnąć indeks kolumny po nazwie DataField:

Code:
using System;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public static class DataGridExtensions
    {
         public static int GetColumnIndexByName(this GridView gridView, string columnName)
         {
             gridView.Columns[]
             if (string.IsNullOrWhiteSpace(columnName))
             {
                 throw new ArgumentNullException("ColumnName can't be null");
             }

             for(int i = 0; i < gridView.Columns.Count; ++i)
             {
                 var dataFieldProperty = gridView.Columns[i].GetType().GetProperty("DataField");
                 if (dataFieldProperty != null)
                 {
                     var column = dataFieldProperty.GetValue(gridView.Columns[i], null).ToString();
                     if (!string.IsNullOrWhiteSpace(column) && column.Equals(columnName))
                     {
                         return i;
                     }
                 }
             }

             return -1;
         }
    }
}

Użycie:

Code:
var columnIndex = gvProducts.GetColumnIndexByName("Name");

Brak komentarzy:

Prześlij komentarz