Получение значения из ячейки грид-вью по событию RowDataBound

string percentage = e.Row.Cells[7].Text;

Я пытаюсь сделать некоторые динамические вещи с моим GridView, поэтому я подключил некоторый код к событию RowDataBound. Я пытаюсь получить значение из определенной ячейки, которая является полем TemplateField. Но приведенный выше код всегда возвращает пустую строку.

Есть какие-нибудь идеи?

Чтобы прояснить ситуацию, вот немного ячейки, в которой происходит нарушение:

<asp:TemplateField HeaderText="# Percentage click throughs">
<ItemTemplate>
    <%# AddPercentClickThroughs((int)Eval("EmailSummary.pLinksClicked"), (int)Eval("NumberOfSends")) %>
</ItemTemplate>
</asp:TemplateField>

В связи с этим, кто-нибудь знает, есть ли лучший способ выбора ячейки в строке. Вводить cell[1] - это отстой. Не могу ли я сделать cell["mycellname"], чтобы, если я решу изменить порядок ячеек, ошибки не появлялись?

Комментарии к вопросу (1)

почему бы не извлекать данные непосредственно из источника данных.

DataBinder.Eval(e.Row.DataItem, "ColumnName")
Комментарии (4)

Когда вы используете поле TemplateField и привязываете к нему литеральный текст, как вы это делаете, asp.net фактически вставляет элемент управления за вас! Он помещается в DataBoundLiteralControl. Это можно увидеть, если посмотреть в отладчике на строку кода, в которой появляется пустой текст.

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

string percentage = ((DataBoundLiteralControl)e.Row.Cells[7].Controls[0]).Text;

В результате вы получите текст!

Комментарии (2)

Выше несколько хороших предложений, но вы можете сделать на текстовое значение ячейки в виде сетки, не оборачивая это в буквальном или элемент управления Label. Вы просто должны знать, какое событие на прослушку. В этом случае, использовать это событие связано, а не, например, так:

protected void GridView1_DataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if (e.Row.Cells[0].Text.Contains("sometext"))
        {
            e.Row.Cells[0].Font.Bold = true;
        }
    }
}

При запуске отладчика, вы увидите текст в этот метод.

Комментарии (2)
Решение

Сначала необходимо обернуть код в элемент управления Label или Literal, чтобы можно было правильно ссылаться на него. Происходит то, что система никак не может отследить это, поскольку нет элемента управления, связанного с текстом. Ответственность за добавление своего содержимого в состояние просмотра лежит на элементе управления.

Чтобы найти элемент управления в строке, необходимо использовать gridView.FindControl("controlName"). Отсюда можно получить доступ к его свойствам, включая Text.

Также можно получить свойство DataItem рассматриваемой строки, привести его к соответствующему типу и извлечь информацию напрямую.

Комментарии (3)

Просто использовать цикл, чтобы проверить вашу ячейку например GridView в:

for (int i = 0; i < GridView2.Rows.Count; i++)
{
    string vr;
    vr = GridView2.Rows[i].Cells[4].Text; // here you go vr = the value of the cel
    if (vr  == "0") // you can check for anything
    {
        GridView2.Rows[i].Cells[4].Text = "Done";
        // you can format this cell 
    }
}
Комментарии (0)

используйте RowDataBound функция для связывания данных с определенным ячейки, и получить контроль использования (АСП имени Управления dropdownlist для) управления GridView.FindControl("имя борьбы с")

Комментарии (0)

У меня был аналогичный вопрос, но нашел решение через несколько иной подход. Вместо того, чтобы искать элемент управления, как Крис предложил, я впервые изменил поле был указан в .aspx-страницы. Вместо того, чтобы использовать <АСП:шаблон ...> по тегу, я изменил поле в вопрос для использования в <как ASP:BoundField ...>. Потом, когда я попал на событие RowDataBound, данные могут быть доступны в клетки напрямую.

Соответствующие фрагменты: во-первых, aspx-страницы:


...Other fields...

...

Затем в событии RowDataBound я могу получить доступ к значениям напрямую:

protected void gvVarianceReport_Sorting(object sender, GridViewSortEventArgs e)
{
    if (e.Row.Cells[2].Text == "0")
    {
        e.Row.Cells[2].Text = "N/A";
        e.Row.Cells[3].Text = "N/A";
        e.Row.Cells[4].Text = "N/A";
    }
}

Если кто-то может прокомментировать почему это работает, я'd и ценю это. Я не'т понять, почему без BoundField значение не в клетке после связывания, но вы должны искать его через контроль.

Комментарии (0)

Если вы установите атрибут видимых на ASP:BoundField к ложь. Такой

Вы не сделать любого текста в ячейках[я].Текстовое свойство, когда вы цикл по строкам. Так

foreach (GridViewRow row in myGrid.Rows)
{
  userList.Add(row.Cells[0].Text); //this will be empty ""
}

Но вы можете установить столбец не виден при подключении сетки к событию OnRowDataBound то из вот этого

e.Row.Cells[0].Visible = false //now the cell has Text but it's hidden
Комментарии (0)






public string AddPercentClickThroughs(decimal NumberOfSends, decimal EmailSummary.pLinksClicked)
{
    decimal OccupancyPercentage = 0;
    if (TotalNoOfRooms != 0 && RoomsOccupied != 0)
    {
        OccupancyPercentage = (Convert.ToDecimal(NumberOfSends) / Convert.ToDecimal(EmailSummary.pLinksClicked) * 100);
    }
    return OccupancyPercentage.ToString("F");
}
Комментарии (0)
Label lblSecret = ((Label)e.Row.FindControl("lblSecret"));
Комментарии (0)
protected void gvbind_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Attributes["onmouseover"] = "this.style.cursor='hand';";
        e.Row.Attributes["onmouseout"] = "this.style.textDecoration='none';";
        e.Row.Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(this.gvbind, "Select$" + e.Row.RowIndex);
    }
}
Комментарии (0)