web-dev-qa-db-fra.com

Obtenir la valeur de cellule d'une ligne GridView

J'utilise le GridView - AutoGenerateSelectButton = "True" pour sélectionner la ligne afin d'obtenir la valeur de cellule de la colonne 1. 

J'ai essayé:

GridViewRow row = dgCustomer.SelectedRow;
TextBox1.Text = "Cell Value" + row.Cells[1].Text + "";

Et il écrit la "valeur de la cellule" mais rien d'autre.

J'ai finalement pu obtenir le numéro de la ligne (index) mais pas la valeur de la cellule. 

GridViewRow row = dgCustomer.SelectedRow;
TextBox1.Text = row.RowIndex.ToString();

J'ai essayé: 

TextBox1.Text = dgCustomer.Rows[row.RowIndex].Cells[1].Text;

et retourne toujours la ligne d'index.

D'autres suggestions? Merci!

11
Lily

Essayez de changer votre code pour

// Get the currently selected row using the SelectedRow property.
GridViewRow row = dgCustomer.SelectedRow;

// And you respective cell's value
TextBox1.Text = row.Cells[1].Text

UPDATE: (basé sur mon commentaire) Si tout ce que vous essayez d'obtenir est la valeur de clé primaire pour la ligne sélectionnée, une autre approche consiste à définir

datakeynames="yourprimarykey"

pour la définition de gridview accessible à partir du code ci-dessous, comme ci-dessous.

TextBox1.Text = CustomersGridView.SelectedValue.ToString();
13
Dennis R

Technique d'itération de formulaire Windows

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    if (row.Selected)
    {
        foreach (DataGridViewCell cell in row.Cells)
        {
            int index = cell.ColumnIndex;
            if (index == 0)
            {
                value = cell.Value.ToString();
                //do what you want with the value
            }
        }
    }
}
5
Nick Roberts

Je vous suggère d'utiliser un champ caché à l'intérieur du champ de modèle, puis d'utiliser FindControl pour rechercher ce champ.

c'est à dire:

ASPX

                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:HiddenField ID="hfFname" runat="server" Value='<%# Eval("FileName") %>' />
                    </ItemTemplate>
                </asp:TemplateField>

Code derrière

protected void gvAttachments_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        GridView gv1 = (GridView)sender;
        GridViewRow gvr1 = (GridViewRow)gv1.Rows[e.RowIndex];

        //get hidden field value and not directly from the GridviewRow, as that will be null or empty!
        HiddenField hf1 = (HiddenField)gvr1.FindControl("hfFname");
        if (hf1 != null)
        {
           ..
        }
    }
2
Fandango68

Avez-vous essayé Cell[0]? Rappelez-vous que les index commencent à 0 et non à 1.

1
Fandango68

Répondant plus haut à Dennis R, la réponse ci-dessus ...

Exemple de définition d'une variable de session sur SelectedIndexChange.

    protected void gvCustomer_SelectedIndexChanged(object sender, EventArgs e)
    {
        int iCustomerID = Convert.ToInt32(Library.gvGetVal(gvCustomer, "CustomerID"));
        Session[SSS.CustomerID] = iCustomerID;
    }

public class Library
{
    public static string gvGetVal(GridView gvGrid, string sHeaderText)
    {
        string sRetVal = string.Empty;
        if (gvGrid.Rows.Count > 0)
        {
            if (gvGrid.SelectedRow != null)
            {
                GridViewRow row = gvGrid.SelectedRow;
                int iCol = gvGetColumn(gvGrid, sHeaderText);
                if (iCol > -1)
                    sRetVal = row.Cells[iCol].Text;
            }
        }
        return sRetVal;
    }

    private static int gvGetColumn(GridView gvGrid, string sHeaderText)
    {
        int iRetVal = -1;
        for (int i = 0; i < gvGrid.Columns.Count; i++)
        {
            if (gvGrid.Columns[i].HeaderText.ToLower().Trim() == sHeaderText.ToLower().Trim())
            {
                iRetVal = i;
            }
        }
        return iRetVal;
    }
}
0
Chris Catignani

J'ai eu le même problème que le vôtre. J'ai constaté que lorsque j'utilise la balise BoundField dans GridView pour afficher mes données. Le row.Cells[1].Text travaille dans: 

GridViewRow row = dgCustomer.SelectedRow;
TextBox1.Text = "Cell Value" + row.Cells[1].Text + "";

Mais quand j'utilise la balise TemplateField pour afficher des données comme celle-ci:

 <asp:TemplateField HeaderText="料號">
    <ItemTemplate>
    <asp:Label ID="Part_No" runat="server" Text='<%# Eval("Part_No")%>' ></asp:Label>
    </ItemTemplate>
    <HeaderStyle CssClass="bhead" />
    <ItemStyle CssClass="bbody" />
    </asp:TemplateField>

Le row.Cells[1].Text ne fait que renvoyer null. Je suis resté coincé dans ce problème pendant longtemps. Je me suis rendu compte récemment et je veux partager ma solution avec quelqu'un qui a le même problème. N'hésitez pas à éditer ce message et/ou à me corriger.

Ma solution:

Label lbCod = GridView1.Rows["AnyValidIndex"].Cells["AnyValidIndex"].Controls["AnyValidIndex"] as Label;

J'utilise l'attribut Controls pour trouver le contrôle Label que j'utilise pour afficher les données et vous pouvez trouver le vôtre. Lorsque vous le trouvez et le convertissez dans le type d'objet correct, vous pouvez extraire du texte, etc. Ex:

string showText = lbCod.Text;

Référence: référence

0
劉鎮瑲

Je cherchais une valeur entière dans la colonne nommée, alors j'ai fait ce qui suit:

int index = dgv_myDataGridView.CurrentCell.RowIndex;

int id = Convert.ToInt32(dgv_myDataGridView["ID", index].Value)

La bonne chose à propos de cela est que la colonne peut être dans n'importe quelle position dans la vue en grille et vous obtiendrez toujours la valeur.

À votre santé

0
Mitchell Stone