2012-02-19 18 views
5

Chciałbym zmienić wartość mojego gridview kolumny aktywne, gdy wartość wynosi 1. Mam gridview kolumny jakJak uzyskać dostęp do kolumny gridview na rowdatabound?

<asp:BoundField DataField="STATUS" HeaderText="STATUS" SortExpression="STATUS" HeaderStyle-HorizontalAlign="Left"> 
       <HeaderStyle HorizontalAlign="Left"></HeaderStyle> 
      </asp:BoundField> 

i cs kod

protected void gvCategory_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 

     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      if (e.Row.Cells[5].Text=="0") 
      { 
       e.Row.Cells[5].Text = "INACTIVE"; 
      } 
     } 
    } 

To działa, ale to by nie działa, jeśli zmienię kolejność kolumn. Potrzebuję czegoś podobnego do funkcji findControl. Dzięki.

Odpowiedz

15

Oto kilka narzędzi pisałem rok temu, które mogą pomóc:

// ---- GetCellByName ---------------------------------- 
// 
// pass in a GridViewRow and a database column name 
// returns a DataControlFieldCell or null 

static public DataControlFieldCell GetCellByName(GridViewRow Row, String CellName) 
{ 
    foreach (DataControlFieldCell Cell in Row.Cells) 
    { 
     if (Cell.ContainingField.ToString() == CellName) 
      return Cell; 
    } 
    return null; 
} 

// ---- GetColumnIndexByHeaderText ---------------------------------- 
// 
// pass in a GridView and a Column's Header Text 
// returns index of the column if found 
// returns -1 if not found 

static public int GetColumnIndexByHeaderText(GridView aGridView, String ColumnText) 
{ 
    TableCell Cell; 
    for (int Index = 0; Index < aGridView.HeaderRow.Cells.Count; Index++) 
    { 
     Cell = aGridView.HeaderRow.Cells[Index]; 
     if (Cell.Text.ToString() == ColumnText) 
      return Index; 
    } 
    return -1; 
} 

// ---- GetColumnIndexByDBName ---------------------------------- 
// 
// pass in a GridView and a database field name 
// returns index of the bound column if found 
// returns -1 if not found 

static public int GetColumnIndexByDBName(GridView aGridView, String ColumnText) 
{ 
    System.Web.UI.WebControls.BoundField DataColumn; 

    for (int Index = 0; Index < aGridView.Columns.Count; Index++) 
    { 
     DataColumn = aGridView.Columns[Index] as System.Web.UI.WebControls.BoundField; 

     if (DataColumn != null) 
     { 
      if (DataColumn.DataField == ColumnText) 
       return Index; 
     } 
    } 
    return -1; 
} 
+0

Dla pierwszej funkcji 'GetCellByName', które powinny być wywołana tylko, gdy jest to typ nagłówka wiersz:' e.Row.RowType == DataControlRowType.Header' –

+0

@DavidFreitas nie sądzę. Używa podstawowego DataControlField danej komórki. –

3

Mogłeś pętla wszystkie kolumny, aby uzyskać prawidłowy indeks lub skorzystać z tej LINQ:

String colToFind = "status"; 
int colIndex = ((GridView)sender).Columns.Cast<DataControlField>() 
       .Where((c, index) => c.HeaderText.ToLower().Equals(colToFind)) 
       .Select((c,index)=>index).First(); 
0

Cleaner łatwiejsze do odczytania LINQ. Tim nie pracował dla mnie.

private int GetFirstGridViewColIndex(string dataField, object sender) 
{ 
    var boundFieldColumns = ((GridView)sender).Columns.Cast<BoundField>(); 

    return boundFieldColumns.Where((column, index) => string.Equals(column.DataField, dataField, StringComparison.InvariantCultureIgnoreCase)) 
     .Select((column, index) => index) 
     .First(); 
} 
Powiązane problemy