2010-10-13 46 views
17

Estoy tratando de escribir un pequeño método para recorrer y encontrar una columna GridView por su índice, ya que puede cambiar de posición en función de lo que podría ser visible.Método para buscar índice de columna GridView por nombre

Esto es lo que tengo hasta ahora:

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; 
} 

En este caso, DataColumn no parece ser el tipo correcto de usar, pero estoy un poco perdido en cuanto a lo que debería hacer aquí.

Solo puedo usar .NET 2.0/3.5. No puedo usar 4.0.

Respuesta

30

Lo descubrí, necesitaba usar DataControlField y una sintaxis ligeramente diferente.

La versión de trabajo:

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

prefiero iteración colección, pero ¿por qué molestarse con la sobrecarga de foreach y grid.Columns.IndexOf llamada en este caso? Simplemente itere a través de una matriz con un índice.

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

Mejor solución que funciona para Datafield, SortExpression y 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

De esta manera, funciona para mí (.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

Parecería que 'HeaderRow' no está inicializado hasta después de datos se enlazan. – Matt

+0

Corrección: hasta después de configurar '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; 
    } 
Cuestiones relacionadas