2010-10-13 28 views
17

Görünürlüğüne göre konumu değiştirebildiğinden, Dizinine göre GridView Sütunu arasında geçiş yapmak ve bulmak için küçük bir yöntem yazmaya çalışıyorum.GridView Sütun Dizini, İsme Göre Bulma Yöntemi

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

, DataColumn kullanma hakkı türü görünmüyor, ama ben ne yapmaları gerektiğini ben tür olarak kayboldum: Burada

Ben bugüne kadar ne olduğunu İşte.

Sadece .NET 2.0/3.5 kullanabilirim. 4.0 kullanamam.

cevap

30

Bunu çözdüm, DataControlField kullanıyordum ve biraz farklı sözdizimi gerekiyordu.

çalışma versiyonu:

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

ben toplama iterasyon tercih ama neden bu durumda foreach yükü ve grid.Columns.IndexOf çağrısı ile rahatsız? Sadece bir dizin ile dizi boyunca yineleyin.

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

Datafield, SortExpression ve headerText için çalışan daha iyi bir çözüm.

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

Bu şekilde, bana (NET Gridview) için çalışır:

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

görünmesi edeceğini 'HeaderRow' veri bağlı olduğu sonrasına kadar başlatılmadı. – Matt

+0

Düzeltme: 'DataSource' ayarlanana kadar. – 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; 
    } 
İlgili konular