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