You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GridView单元格字符串值获取及行颜色自定义问题求助

问题:GridView行颜色自定义及单元格值获取失败

问题背景

在实现GridView根据特定列值修改行颜色时,无法正确获取字符串类型的单元格值。教程中使用的是获取整数的代码:

int stock = Convert.ToInt32(GridView1.Rows[i].Cells[4].Text);

我尝试了两种获取字符串的写法,但均失败:

string cell = Convert.ToString(GridView1.Rows[i].Cells[11].Text);
string cell = (GridView1.Rows[i].Cells[11].Text);

更新的代码信息

GridView的ASPX代码

<asp:GridView ID="GridView1" runat="server" AllowPaging="True"
    AutoGenerateColumns="False" DataKeyNames="ID"
    DataSourceID="SqlAdmin" OnRowDataBound="GridView1_RowDataBound" PageSize="150" Width="100%">
    <Columns>
        <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" InsertVisible="False" ReadOnly="True" Visible="False"></asp:BoundField>

        <asp:TemplateField HeaderText="Comment" SortExpression="COMMENT">
            <ControlStyle Width="800px" />
            <HeaderStyle Wrap="False" />
            <EditItemTemplate>
                <asp:TextBox ID="txtCOMMENT" runat="server" Text='<%# Bind("COMMENT") %>'></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:TextBox ID="COMMENTtxt" runat="server"
                    Text='<%# Bind("COMMENT") %>'></asp:TextBox>
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center" />
        </asp:TemplateField>

        <asp:TemplateField HeaderText="Part #" SortExpression="PART_NO">
            <EditItemTemplate>
                <asp:TextBox ID="txtPartNo" runat="server" Text='<%# Bind("PART_NO") %>'></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:TextBox ID="PartNotxt" runat="server"
                    Text='<%# Bind("PART_NO") %>'></asp:TextBox>
            </ItemTemplate>
            <ControlStyle Width="150px" />
            <ItemStyle HorizontalAlign="Center" />
        </asp:TemplateField>

        <asp:TemplateField HeaderText="Notes" SortExpression="NOTE">
            <EditItemTemplate>
                <asp:TextBox ID="txtNOTE" runat="server" Text='<%# Bind("NOTE") %>'></asp:TextBox>
            </EditItemTemplate>
            <ItemTemplate>
                <asp:TextBox ID="NOTEtxt" runat="server"
                    Text='<%# Bind("NOTE") %>'></asp:TextBox>
            </ItemTemplate>
            <ControlStyle Width="500px" />
            <ItemStyle HorizontalAlign="Center" />
        </asp:TemplateField>
</asp:GridView>

行颜色修改的后台代码

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    for (int i = 0; i < GridView1.Rows.Count; i++)
    {
        TextBox COMMENTtxt = (TextBox)gRow.FindControl("COMMENTtxt");

        if (COMMENTtxt == "x")
        {
            GridView1.Rows[i].BackColor = Color.Yellow;
        }
        else
        {
            GridView1.Rows[i].BackColor = Color.White;
        }
    }
}

解决方案

核心问题分析

  1. 目标列使用的是TemplateField而非BoundField,直接通过Cells[index].Text无法获取值——单元格内嵌套的是TextBox控件,必须先找到控件再读取其Text属性。
  2. 后台代码中gRow是未定义变量,应使用事件参数的e.Row;直接比较TextBox对象与字符串"x"是错误逻辑,需读取TextBox.Text属性。
  3. RowDataBound事件是逐行绑定触发的,无需循环遍历所有行,直接处理当前行即可。

修正后的后台代码

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // 仅处理数据行,跳过表头、页脚行
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // 找到当前行的COMMENTtxt控件
        TextBox commentTxt = (TextBox)e.Row.FindControl("COMMENTtxt");
        
        // 判断文本值是否为"x",添加Trim()处理可能的空格
        if (commentTxt != null && commentTxt.Text.Trim() == "x")
        {
            e.Row.BackColor = Color.Yellow;
        }
        else
        {
            e.Row.BackColor = Color.White;
        }
    }
}

额外说明

如果是从BoundField列获取字符串值,写法为:

string cellValue = e.Row.Cells[index].Text.Trim();

而TemplateField必须通过FindControl定位内部控件后再取值,这是两种列类型的核心区别。

内容的提问来源于stack exchange,提问作者ServalChan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:30:43