Hallo Jessica,
protected void SelectGridRowById(GridView grid, int id, int idCellPos)
{
int rows = grid.Rows.Count;
for (int i = 0; i < rows; i++)
{
if (Convert.ToInt32(grid.Rows[i].Cells[idCellPos].Text) == id)
{
grid.SelectedIndex = i;
break;
}
}
}
Es wäre mir aber deutlich lieber, wenn ich die Spalte anhand ihrer Bezeichnung irgendwie ansprechen könnte, statt über ihre Position im Grid. Das hat den Grund, dass die Wahrscheinlichkeit, dass sich die Bezeichnung ändert weit geringer ist, als dass sich
die Position ändert.
Gibt es da irgend eine Möglichkeit, die ich übersehen habe?
Denke nicht, dass Du da etwas übersehen hast. An den Index der gesuchten Spalte kommt man m.W. nur durch Enumerieren über die vorhandenen Spaltenbeschreibungen in Kombination mit der IndexOf Methode der Columns Sammlung:
int index = -1;
foreach (DataControlField dcf in GridView1.Columns)
{
if (dcf.HeaderText == "Test")
{
index = GridView1.Columns.IndexOf(dcf);
}
}
Oder über die HeaderRow.Cells Auflistung, wenn man das Grid komplett auf Basis der Datenquelle erstellen lässt:
int index = -1;
for (int i = 0; i < GridView1.HeaderRow.Cells.Count; i++ )
{
if (GridView1.HeaderRow.Cells[i].Text == "Name")
{
index = i;
}
}
HeaderRow ist null, wenn das Grid keine Daten anzeigt.
Ggf. ist es sinnvoll die Spaltenbezeichner + Indizes einmalig beim Laden der Seite in ein eigenes Dictionary<string, int> zu laden und darüber direkt über den Spaltenbezeichner auf den Index zuzugreifen. Bei einem einmaligen Zugriff lohnt das jedoch
nicht.
Manuell zu pflegen, aber noch eine Option, wäre ein Enum mit den Indizes der Spalten:
enum Column
{
ID = 0,
Name = 1
}
// ...
string result = GridView1.Rows[0].Cells[(int)Column.Name].Text;
Da Du das aber wieder selber nachführen musst, ist das natürlich ähnlich Fehleranfällig, wie die manuelle Angabe des Spaltenindex/Spaltenposition, nur würdest Du den Index einmalig ändern, wenn sich Verschiebungen ergeben, im Code referenziert weiter Column.Name
auf den passenden Index.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de