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; } } }
解决方案
核心问题分析
- 目标列使用的是
TemplateField而非BoundField,直接通过Cells[index].Text无法获取值——单元格内嵌套的是TextBox控件,必须先找到控件再读取其Text属性。 - 后台代码中
gRow是未定义变量,应使用事件参数的e.Row;直接比较TextBox对象与字符串"x"是错误逻辑,需读取TextBox.Text属性。 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
相关产品推荐
相关产品推荐

