Come ottenere il valore della cella per nome colonna non per indice in GridView in asp.net

Sto avendo una gridview in asp.net e ora voglio il valore della cella per il nome della colonna ma non per l’indice della cella.

Come sarebbe ansible recuperando il valore della cella dal nome della colonna della cella

GridView non agisce come nomi di colonne, poiché è la proprietà delle datasource per sapere queste cose.

Se è ancora necessario conoscere l’indice in base al nome di una colonna, è ansible creare un metodo di supporto per fare ciò poiché l’intestazione di gridview normalmente contiene queste informazioni.

 int GetColumnIndexByName(GridViewRow row, string columnName) { int columnIndex = 0; foreach (DataControlFieldCell cell in row.Cells) { if (cell.ContainingField is BoundField) if (((BoundField)cell.ContainingField).DataField.Equals(columnName)) break; columnIndex++; // keep adding 1 while we don't have the correct name } return columnIndex; } 

ricorda che il codice sopra utilizzerà un BoundField … quindi BoundField come:

 protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { int index = GetColumnIndexByName(e.Row, "myDataField"); string columnValue = e.Row.Cells[index].Text; } } 

Ti suggerisco caldamente di usare il TemplateField per avere i tuoi controlli, quindi è più facile afferrare quei controlli come:

          

e quindi usare

 string columnValue = ((Label)e.Row.FindControl("lblName")).Text; 

Anche se è molto tempo, ma questo pezzo di codice relativamente piccolo sembra facile da leggere e ottenere:

 protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) { int index; string cellContent; foreach (TableCell tc in ((GridView)sender).HeaderRow.Cells) { if( tc.Text.Equals("yourColumnName") ) { index = ((GridView)sender).HeaderRow.Cells.GetCellIndex(tc); cellContent = ((GridView)sender).SelectedRow.Cells[index].Text; break; } } } 

È ansible utilizzare DataRowView per ottenere l’indice della colonna.

  void OnRequestsGridRowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { var data = e.Row.DataItem as DataRowView; // replace request name with a link if (data.DataView.Table.Columns["Request Name"] != null) { // get the request name string title = data["Request Name"].ToString(); // get the column index int idx = data.Row.Table.Columns["Request Name"].Ordinal; // ... e.Row.Cells[idx].Controls.Clear(); e.Row.Cells[idx].Controls.Add(link); } } } 

Per gli amanti della Lambda

 protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { var boundFields = e.Row.Cells.Cast() .Select(cell => cell.ContainingField).Cast().ToList(); int idx = boundFields.IndexOf( boundFields.FirstOrDefault(f => f.DataField == "ColName")); e.Row.Cells[idx].Text = modification; } } 

Un piccolo bug con indexcolumn nella risposta di alexander: Dobbiamo occuparci della colonna “not found”:

 int GetColumnIndexByName(GridViewRow row, string columnName) { int columnIndex = 0; int foundIndex=-1; foreach (DataControlFieldCell cell in row.Cells) { if (cell.ContainingField is BoundField) { if (((BoundField)cell.ContainingField).DataField.Equals(columnName)) { foundIndex=columnIndex; break; } } columnIndex++; // keep adding 1 while we don't have the correct name } return foundIndex; } 

e

 protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { int index = GetColumnIndexByName(e.Row, "myDataField"); if( index>0) { string columnValue = e.Row.Cells[index].Text; } } } 

Basato su qualcosa trovato su Code Project

Una volta che la tabella di dati viene dichiarata in base all’origine dati della griglia, cercare l’indice della colonna in base al nome della colonna dall’insieme di colonne. A questo punto, utilizzare l’indice in base alle esigenze per ottenere informazioni da o per formattare la cella.

 protected void gridMyGrid_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { DataTable dt = (DataTable)((GridView)sender).DataSource; int colIndex = dt.Columns["MyColumnName"].Ordinal; e.Row.Cells[colIndex].BackColor = Color.FromName("#ffeb9c"); } } 

Le celle Riga intestazione a volte non funzionano. Questo restituirà solo la colonna Index. Aiuterà in molti modi diversi. So che questa non è la risposta che sta chiedendo. Ma questo aiuterà molte persone.

 public static int GetColumnIndexByName(GridView gridView, string columnName) { for (int i = 0; i < gridView.Columns.Count ; i++) { if (gridView.Columns[i].HeaderText.ToUpper() == columnName.ToUpper() ) { return i; } } return -1; }