2010-10-13 18 views
17

Sto provando a scrivere un piccolo metodo per eseguire il loop e trovare una colonna GridView dal suo indice, poiché può cambiare posizione in base a ciò che potrebbe essere visibile.Metodo per trovare l'indice della colonna GridView per nome

Ecco quello che ho finora:

private int GetColumnIndexByName(GridView grid, string name) 
{ 
    foreach (DataColumn col in grid.Columns) 
    { 
     if (col.ColumnName.ToLower().Trim() == name.ToLower().Trim()) return col.Ordinal; 
    } 

    return -1; 
} 

In questo caso, DataColumn non sembra essere il tipo giusto da usare, ma sto tipo di perso su ciò che dovrei fare Qui.

Posso solo utilizzare .NET 2.0/3.5. Non posso usare 4.0.

risposta

30

L'ho capito, avevo bisogno di usare DataControlField e una sintassi leggermente diversa.

la versione di lavoro:

private int GetColumnIndexByName(GridView grid, string name) 
    { 
     foreach (DataControlField col in grid.Columns) 
     { 
      if (col.HeaderText.ToLower().Trim() == name.ToLower().Trim()) 
      { 
       return grid.Columns.IndexOf(col); 
      } 
     } 

     return -1; 
    } 
16

preferisco raccolta iterazione ma perché preoccuparsi con il sovraccarico di foreach e grid.Columns.IndexOf chiamata in questo caso? Basta scorrere l'array con un indice.

private int GetColumnIndexByName(GridView grid, string name) 
{ 
    for(int i = 0; i < grid.Columns.Count; i++) 
    { 
     if (grid.Columns[i].HeaderText.ToLower().Trim() == name.ToLower().Trim()) 
     { 
      return i; 
     } 
    } 

    return -1; 
} 
1

Soluzione migliore che funziona per Datafield, SortExpression e headerText.

public static int GetBoundFieldIndexByName(this GridView gv,string name) 
    { 
     int index = 0; 
     bool found = false; 
     foreach (DataControlField c in gv.Columns) 
     { 
      if (c is BoundField) 
      { 
       BoundField field = (BoundField)c; 
       if (name == field.DataField || 
        name == field.SortExpression || 
        name == field.HeaderText) 
       { 
        found = true; 
        break; 
       } 
      } 
      index++; 
     } 
     return found ? index : -1; 
    } 
1

In questo modo, funziona per me (NET GridView):

private int GetColumnIndexByName(GridView grid, string name) 
    { 
     for (int i = 0; i < grid.HeaderRow.Cells.Count; i++) 
     { 
      if (grid.HeaderRow.Cells[i].Text.ToLower().Trim() == name.ToLower().Trim()) 
      { 
       return i; 
      } 
     } 
     return -1; 
    } 
+0

Sembrerebbe che 'HeaderRow' non viene inizializzato solo dopo dati è associato. Correzione – Matt

+0

: fino a quando è impostato 'DataSource'. – Matt

0
//Get index of column by header text. 
    int GetColumnIndexByName(GridViewRow row, string headerText) 
    { 
     int columnIndex = 0; 
     foreach (DataControlFieldCell cell in row.Cells) 
     { 
      if(cell.ContainingField is TemplateField){ 
       if(((TemplateField)cell.ContainingField).HeaderText.Equals(headerText)) 
       { 
        break; 
       } 
      } 
      if(cell.ContainingField is BoundField){ 
        if (((BoundField)cell.ContainingField).HeaderText.Equals(headerText)) 
       { 
        break; 
       } 
      } 
      columnIndex++; 
     } 


     return columnIndex; 
    } 
Problemi correlati