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

GridView文本框填充DataTable值异常:重复显示最后值如何解决

解决GridView每行TextBox重复显示最后一条DataTable值的问题

嘿,我帮你捋捋这个问题!你现在遇到的是GridView绑定数据时的典型错误——因为每次都重复查询数据库且没有匹配当前行的学生数据,导致最后一条记录的Mark值被覆盖到了所有TextBox里。下面是具体的解决思路和修正方案:

问题根源

你目前的代码应该是在RowDataBound事件里每次都重新创建SqlDataAdapter和DataTable,而且没有根据当前行的学生标识(比如StudentID)去匹配对应的Mark值,循环下来就把最后一条数据的Mark赋值给了所有行的TextBox。

最优解决方案:一次性绑定所有数据

这种方法既高效又能避免重复值的问题,步骤如下:

  1. 在Page_Load中一次性查询并绑定数据
    先把学生信息和对应的Mark数据从数据库一次性查出来,绑定到GridView,这样每行都能关联到自己的数据项:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // 替换成你的实际查询语句和连接字符串
            string query = "SELECT StudentID, Name, Mark FROM Students";
            string connStr = "你的数据库连接字符串";
            
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                SqlDataAdapter da = new SqlDataAdapter(query, conn);
                DataTable dt = new DataTable();
                da.Fill(dt);
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
        }
    }
    
  2. 在RowDataBound中从当前行DataItem取值
    绑定每行时,直接从该行对应的DataItem里提取Mark值,赋值给TextBox:

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        // 只处理数据行,跳过表头、页脚等非数据行
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // 获取当前行绑定的数据视图
            DataRowView rowData = (DataRowView)e.Row.DataItem;
            // 找到TextBox控件
            TextBox markTextBox = (TextBox)e.Row.FindControl("MarkTextBox");
            // 赋值Mark值,注意处理DBNull的情况
            markTextBox.Text = rowData["Mark"] != DBNull.Value ? rowData["Mark"].ToString() : "";
        }
    }
    
  3. 确保GridView的列配置正确
    记得把AutoGenerateColumns设为false,手动配置列,包含绑定学生信息的字段和TextBox模板列:

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound">
        <Columns>
            <asp:BoundField DataField="StudentID" HeaderText="学生ID" />
            <asp:BoundField DataField="Name" HeaderText="姓名" />
            <asp:TemplateField HeaderText="分数">
                <ItemTemplate>
                    <asp:TextBox ID="MarkTextBox" runat="server"></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    

特殊场景:必须逐行查询的情况

如果因为业务逻辑必须在每行绑定的时候单独查询(不推荐,性能差),那一定要根据当前行的学生ID作为查询条件,避免取错值:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // 获取当前行的学生ID
        string studentId = DataBinder.Eval(e.Row.DataItem, "StudentID").ToString();
        TextBox markTextBox = (TextBox)e.Row.FindControl("MarkTextBox");
        
        string connStr = "你的数据库连接字符串";
        string query = "SELECT Mark FROM Students WHERE StudentID = @StudentID";
        
        using (SqlConnection conn = new SqlConnection(connStr))
        {
            SqlCommand cmd = new SqlCommand(query, conn);
            cmd.Parameters.AddWithValue("@StudentID", studentId);
            
            conn.Open();
            object markValue = cmd.ExecuteScalar();
            conn.Close();
            
            markTextBox.Text = markValue != DBNull.Value ? markValue.ToString() : "";
        }
    }
}

这样处理后,每行的TextBox就会显示对应学生的Mark值,不会再出现最后一条数据重复的问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:10:53