web-dev-qa-db-fra.com

Comment obtenir la valeur de cellule par nom de colonne et non par index dans GridView dans asp.net

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

40
Vara Prasad.M

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;
64
balexandre

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);
            }
        }
    }
2
Daniel Nutu

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;        
    }
}
2
蕭為元

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;
       }
    }
}
2
Sadiq

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

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");
    }
}
0
Galactic

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