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

qui*_*qui 31 c# asp.net gridview

string percentage = e.Row.Cells[7].Text;
Run Code Online (Sandbox Code Playgroud)

我试图用我的GridView做一些动态的东西,所以我把一些代码连接到RowDataBound事件.我试图从特定的单元格中获取值,这是一个TemplateField.但上面的代码似乎总是返回一个空字符串.

有任何想法吗?

澄清一下,这里有点违规的细胞:

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

在相关的说明中,有没有人知道是否有更好的方法来选择行中的单元格.它很糟糕cell[1].我不能这样做cell["mycellname"],所以如果我决定改变我的细胞的顺序,那么虫子不会出现?

Ste*_*ton 52

为什么不直接从数据源中提取数据.

DataBinder.Eval(e.Row.DataItem, "ColumnName")
Run Code Online (Sandbox Code Playgroud)

  • 您的回答可能不适用于 OP 的问题,但对我有所帮助。我试图获取 GridView 的 TemplateField 中包含的密码模式 TextBox 字段的值,以便我可以在 RowDataBound 的 TextBox 中分配星号(默认行为是在密码模式 TextBox 中不显示任何内容)。DataBinder.Eval() 做到了。 (2认同)
  • 呵呵,感谢我认识的这个疯狂的老人,但它对我帮助很大。 (2认同)

Chr*_*ris 23

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

因此,要在不更改模板的情况下访问信息以使用控件,您可以这样投射:

string percentage = ((DataBoundLiteralControl)e.Row.Cells[7].Controls[0]).Text;
Run Code Online (Sandbox Code Playgroud)

那会得到你的文字!


小智 13

以上是很好的建议,但您可以在网格视图中获取单元格的文本值,而无需将其包装在文字或标签控件中.你只需要知道要连接的事件.在这种情况下,请改用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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

运行调试器时,您将看到此方法中出现的文本.

  • 如此聪明,检查当前行是否为数据行 (3认同)

Ori*_*ian 11

首先,您需要将代码包装在一个Label或一个Literal控件中,以便您可以正确引用它.发生的事情是系统没有办法跟踪它,因为没有与文本相关的控制.控件的责任是将其内容添加到viewstate.

你需要使用gridView.FindControl("controlName"); 获得行中的控件.从那里你可以得到它的属性,包括Text.

您还可以获取相关行的DataItem属性并将其转换为适当的类型并直接提取信息.

  • 您不需要将代码包装在Label或Literal中.请参阅下面的答案. (2认同)

小智 6

只需使用循环来检查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 
    }
}
Run Code Online (Sandbox Code Playgroud)