Получение значения из ячейки из сетки в событии RowDataBound - PullRequest
31 голосов
/ 23 сентября 2008
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"], поэтому, если я решу изменить порядок своих ячеек, ошибки не появятся?

Ответы [ 11 ]

50 голосов
/ 23 сентября 2008

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

DataBinder.Eval(e.Row.DataItem, "ColumnName")
23 голосов
/ 07 октября 2008

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

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

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

Это даст вам ваш текст!

13 голосов
/ 10 апреля 2009

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

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

При запуске отладчика текст будет отображаться в этом методе.

11 голосов
/ 23 сентября 2008

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

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

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

6 голосов
/ 30 марта 2011

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

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 
    }
}
1 голос
/ 27 сентября 2012

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

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

<asp:GridView ID="gvVarianceReport" runat="server" ... >
...Other fields...
    <asp:BoundField DataField="TotalExpected" 
     HeaderText="Total Expected <br />Filtration Events" 
     HtmlEncode="False" ItemStyle-HorizontalAlign="Left" 
     SortExpression="TotalExpected" />
...
</asp:Gridview>

Затем в событии 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";
    }
}

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

1 голос
/ 06 апреля 2011

функция RowDataBound используется для привязки данных к перикулярной ячейке и получения контроля (Имя элемента управления ASP, например DropDownList) GridView.FindControl("Name of Control")

0 голосов
/ 19 января 2017

Если вы установите атрибут Видимый в asp: BoundField на Ложь . Как это

<asp:BoundField DataField="F1" HeaderText="F1" Visible="False"/>

Вы будете не получать любой текст в свойстве Cells [i] .Text при зацикливании строк. Так

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 голосов
/ 05 апреля 2015
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 голосов
/ 09 октября 2014
<asp:TemplateField HeaderText="# Percentage click throughs">
  <ItemTemplate>
    <%# AddPercentClickThroughs(Convert.ToDecimal(DataBinder.Eval(Container.DataItem, "EmailSummary.pLinksClicked")), Convert.ToDecimal(DataBinder.Eval(Container.DataItem, "NumberOfSends")))%>
  </ItemTemplate>
</asp:TemplateField>


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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...