Получить значение ячейки строки GridView

Я использую GridView - AutoGenerateSelectButton = "True", чтобы выбрать строку, чтобы получить значение ячейки столбца 1.

Я пробовал:

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

И он пишет "Cell Value", но ничего больше.

Наконец, я смог получить номер строки (index), но не значение ячейки.

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

Я пробовал:

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

и все еще возвращает строку индекса.

Любые другие предложения? Спасибо!

Ответ 1

Попробуйте изменить свой код на

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

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

ОБНОВЛЕНИЕ: (на основе моего комментария) Если все, что вы пытаетесь получить, является значением первичного ключа для выбранной строки, тогда альтернативный подход заключается в установке

datakeynames="yourprimarykey"

для определения gridview, к которому можно получить доступ из кода, как показано ниже.

TextBox1.Text = CustomersGridView.SelectedValue.ToString();

Ответ 2

Технология итерации формы 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
            }
        }
    }
}

Ответ 3

Я предлагаю вам использовать поле 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)
        {
           ..
        }
    }

Ответ 4

Вы пробовали Cell[0]? Помните, что индексы начинаются с 0, а не 1.

Ответ 5

Более подробно о ответе Денниса Р выше... Это позволит получить значение, основанное на тексте заголовка (поэтому вам не нужно знать, какой столбец... особенно, если его динамическое изменение).

Пример установки переменной сеанса в 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;
    }
}

Ответ 6

У меня была такая же проблема, как у вас. Я обнаружил, что когда я использую тег BoundField в GridView, чтобы показать свои данные. 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;

Ссылка: ссылка

Ответ 7

Я искал целочисленное значение в именованном столбце, поэтому я сделал следующее:

int index = dgv_myDataGridView.CurrentCell.RowIndex;

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

Хорошая вещь об этом - то, что столбец может быть в любой позиции в представлении сетки, и вы все равно получите значение.

ура

Ответ 8

string id;
foreach (GridViewRow rows in grd.Rows)
{
   TextBox lblStrucID = (TextBox)rows.FindControl("grdtext");
   id=lblStrucID.Text
}