从RowDataBound事件的gridview的单元格获取值

时间:2020-03-06 14:36:20  来源:igfitidea点击:
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>

与此相关的是,有谁知道在行中选择单元格是否有更好的方法。放入单元格[1]很烂。我不能做cell [" mycellname"],所以如果我决定更改单元格的顺序,将不会出现错误吗?

解决方案

首先,我们需要将代码包装在Label或者Literal控件中,以便可以正确地引用它。发生的事情是系统无法跟踪它,因为没有与文本关联的控件。控件的责任是将其内容添加到viewstate。

我们需要使用gridView.FindControl(" controlName");在行中获取控件。从那里可以得到它的属性,包括"文本"。

我们还可以获取相关行的DataItem属性,并将其强制转换为适当的类型,然后直接提取信息。

为什么不将数据直接从数据源中拉出。

DataBinder.Eval(e.Row.DataItem, "ColumnName")

当我们像使用模板字段一样使用TemplateField并将文本文本绑定到它时,asp.net实际上将为我们插入一个控件!它被放入DataBoundLiteralControl中。如果我们在调试器中查看正在获取空文本的代码行附近,就可以看到此信息。

因此,要在不更改模板以使用控件的情况下访问信息,可以像这样进行转换:

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

那会给你你的文字!

以上是很好的建议,但是我们可以在网格视图中获得单元格的文本值,而无需将其包装在文字或者标签控件中。我们只需要知道要连接什么事件。在这种情况下,请改用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;
        }
    }
}

运行调试器时,我们会看到文本出现在此方法中。