J'ai une gridview
dans asp.net et maintenant je veux la valeur de la cellule par le nom de la colonne mais pas par l'index de la cellule.
Comment serait-il possible en récupérant la valeur de la cellule par le nom de colonne de la cellule
GridView
n'agit pas en tant que noms de colonne, car il s'agit de la propriété datasource
pour connaître ces éléments.
Si vous devez toujours connaître l'index en fonction du nom de la colonne, vous pouvez créer une méthode d'assistance à cet effet, car l'en-tête gridview
contient normalement ces informations.
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;
}
rappelez-vous que le code ci-dessus utilisera une BoundField
... puis utilisez-le comme ceci:
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;
}
}
Je suggérerais fortement que vous utilisiez la TemplateField
pour avoir vos propres contrôles, alors il est plus facile de saisir ces contrôles comme:
<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>
et ensuite utiliser
string columnValue = ((Label)e.Row.FindControl("lblName")).Text;
Vous pouvez utiliser DataRowView pour obtenir l'index de colonne.
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);
}
}
}
Pour les amateurs de 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;
}
}
Bien que ce soit une longue période, mais cette partie de code relativement petite semble facile à lire et à obtenir:
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;
}
}
}
Un petit bug avec indexcolumn dans la réponse d'Alexander: Nous devons nous occuper de la colonne "introuvable":
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;
}
et
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;
}
}
}
Basé sur quelque chose trouvé sur Code Project
Une fois que la table de données est déclarée en fonction de la source de données de la grille, recherchez l'index de colonne par nom de colonne dans la collection de colonnes. À ce stade, utilisez l'index selon vos besoins pour obtenir des informations à partir de ou pour formater la cellule.
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");
}
}
Les cellules d'en-tête ne fonctionnent parfois pas. Cela retournera simplement la colonne Index. Cela vous aidera de différentes manières. Je sais que ce n'est pas la réponse qu'il demande. Mais cela aidera pour beaucoup de gens.
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;
}