web-dev-qa-db-ja.com

GridView行のセル値を取得します

GridViewを使用しています-AutoGenerateSelectButton = "True"列1のセル値を取得するために行を選択します。

私が試してみました:

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

そして、それは「セル値」を書き込みますが、それ以外は何も書き込みません。

最終的に行の数(インデックス)を取得できましたが、セルの値は取得できませんでした。

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

私が試してみました:

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

引き続きインデックス行を返します。

他の提案はありますか?ありがとうございました!

12
Lily

コードを変更してみてください

// 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

PDATE:(私のコメントに基づく)取得しようとしているのが選択した行の主キー値のみである場合、代替アプローチは設定することです

datakeynames="yourprimarykey"

以下のようなコードビハインドからアクセスできるgridview定義の場合。

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

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
            }
        }
    }
}
6
Nick Roberts

テンプレートフィールド内でHiddenFieldを使用し、FindControlを使用してこのフィールドを見つけることをお勧めします。

すなわち:

ASPX

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

コードビハインド

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

やってみました Cell[0]?インデックスは1ではなく0から始まることに注意してください。

1
Fandango68

上記のデニスRの回答を展開すると...これは見出しテキストに基づいて値を取得します(そのため、特に動的に変化する場合は、どの列を知る必要はありません)。

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

私はあなたと同じ問題を抱えていました。 GridViewでBoundFieldタグを使用してデータを表示すると、そのことがわかりました。 row.Cells[1].Textはで働いています:

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

しかし、TemplateFieldタグを使用して次のようなデータを表示する場合:

 <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>

row.Cells[1].Textは単にnullを返します。私は長い間この問題に巻き込まれました。私は最近考え出し、同じ問題を抱えている人と私のソリューションを共有したいと思います。この投稿を編集および/または修正してください。

私のソリューション:

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

Controls属性を使用して、データを表示するために使用するLabelコントロールを見つけます。それを見つけて、正しいタイプのオブジェクトに変換すると、テキストなどを抽出できます。例:

string showText = lbCod.Text;

参照: 参照

0
劉鎮瑲

名前付き列で整数値を探していたので、以下を行いました:

int index = dgv_myDataGridView.CurrentCell.RowIndex;

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

これの良い点は、列がグリッドビュー内の任意の位置にある場合でも、値を取得できることです。

乾杯

0
Mitchell Stone