Получение значения из ячейки из gridview в событии 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
Сначала вам нужно обернуть свой код в элементе управления Label
или Literal
, чтобы вы могли правильно ссылаться на него. Что происходит, так это то, что система не может отслеживать ее, потому что нет никакого контроля, связанного с текстом. Это ответственность за управление, чтобы добавить его содержимое в viewstate.
Вам нужно использовать gridView.FindControl( "controlName" ); чтобы получить контроль в строке. Оттуда вы можете получить свои свойства, включая Text
.
Вы также можете получить свойство DataItem рассматриваемой строки и передать ее соответствующему типу и извлечь информацию напрямую.
Ответ 2
почему бы не вытащить данные непосредственно из источника данных.
DataBinder.Eval(e.Row.DataItem, "ColumnName")
Ответ 3
Когда вы используете TemplateField и связываете с ним буквальный текст, как вы делаете, asp.net фактически вставляет элемент управления FOR YOU! Он попадает в DataBoundLiteralControl. Вы можете увидеть это, если вы посмотрите в отладчике рядом с вашей строкой кода, который получает пустой текст.
Итак, чтобы получить доступ к информации, не изменяя шаблон для использования элемента управления, вы должны сделать следующее:
string percentage = ((DataBoundLiteralControl)e.Row.Cells[7].Controls[0]).Text;
Это даст вам ваш текст!
Ответ 4
Вышеприведенные рекомендации являются полезными, но вы можете получить текстовое значение ячейки в виде сетки без ее обертывания в литеральном или контрольном ярлыке. Вы просто должны знать, какое событие провести. В этом случае вместо этого используйте событие 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;
}
}
}
При запуске отладчика вы увидите, что текст появляется в этом методе.
Ответ 5
Просто используйте цикл для проверки вашей ячейки в 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
}
}
Ответ 6
использовать функцию RowDataBound
для связывания данных с перкулярной ячейкой и для получения контроля
(ASP Control Name, например DropDownList) GridView.FindControl("Name of Control")
Ответ 7
У меня был аналогичный вопрос, но нашел решение с помощью немного другого подхода. Вместо того, чтобы искать контроль, как предложил Крис, я сначала изменил способ, которым поле было указано на странице .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 значение не находится в ячейке после привязки, но вы должны искать его с помощью элемента управления.
Ответ 8
Label lblSecret = ((Label)e.Row.FindControl("lblSecret"));
Ответ 9
<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");
}
Ответ 10
Если вы установите атрибут Видимый на asp: BoundField на False. Как этот
<asp:BoundField DataField="F1" HeaderText="F1" Visible="False"/>
Вы будете не получать текст Text в ячейках [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 hidden
Ответ 11
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);
}
}