2012-03-15 1 views

risposta

57

GridView non agisce nomi delle colonne, come il gioco è fatto è datasource proprietà di sapere queste cose.

Se è ancora necessario conoscere l'indice in base al nome di una colonna, è possibile creare un metodo di supporto per fare ciò poiché l'intestazione 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; 
} 

ricordare che il codice di cui sopra userà un BoundField ... quindi utilizzarlo 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; 
    } 
} 

Vorrei suggerire di utilizzare il TemplateField di avere i propri controlli, quindi è più facile afferrare i comandi come:

<asp:GridView ID="gv" runat="server"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>' /> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

e quindi utilizzare

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

questo è un salvavita! grazie – Artin

+0

concordato. Salvavita. Grazie! Questo sta succedendo nella mia "piccola busta di utilità" – pStan

+0

@balexandre Cosa succede se è un TemplateField? Ho sia BoundField che TemplateField in una riga. –

2

Anche se è un lungo periodo di tempo, ma questo relativamente piccolo pezzo di codice 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; 
     } 
    } 
} 
2

È possibile utilizzare il DataRowView per ottenere l'indice di 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); 
      } 
     } 
    } 
2

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<DataControlFieldCell>() 
      .Select(cell => cell.ContainingField).Cast<BoundField>().ToList(); 

     int idx = boundFields.IndexOf(
      boundFields.FirstOrDefault(f => f.DataField == "ColName")); 

     e.Row.Cells[idx].Text = modification;   
    } 
} 
0

Un piccolo bug con IndexColumn nella risposta di alexander: Abbiamo bisogno di prendersi cura di colonna "non trovato":

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

In base a 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 dalla raccolta 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"); 
    } 
} 
+0

Si prega di non pubblicare solo codice semplice. Vai avanti e spiega la tua soluzione. –