none
Ist es möglich anhand des Spaltennamens auf eine Zelle in einem Grid zuzugreifen? RRS feed

  • Frage

  • Ich habe folgendes Problem:

    Ich möchte eine bestimmte Zeile in einem GridView anhand einer Id, die in einer bestimmten Spalte steht, selektieren.

    Eigentlich klappt das hiermit soweit auch ganz gut:

    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? Ich habe zwar Ansätze für VB gefunden, aber da ich C# verwende, funktionieren die leider nicht und ich konnte sie leider auch nicht wirklich darauf übertragen.

    Danke im Voraus,

    Jessica

    Montag, 2. August 2010 10:58

Antworten

  • 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
    Montag, 2. August 2010 20:48
    Beantworter