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

ASP.NET GridView删除行后其余行输入数据丢失问题求助

问题根因

你的新增行逻辑里会先把页面上所有文本框的最新输入同步到ViewState存储的DataTable后再做后续操作,但删除行逻辑漏掉了这个同步步骤:直接读取ViewState里存储的旧DataTable删除目标行后重新绑定,用户最新输入的未同步内容自然就清空了。

修复方案

替换你现有的Gridview1_SelectedIndexChanged方法代码即可,完整修改后的逻辑如下:

protected void Gridview1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (ViewState["CurrentTable"] == null) return;
    DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];

    // 第一步:先把当前页面所有行的最新输入同步到DataTable
    for (int i = 0; i < Gridview1.Rows.Count; i++)
    {
        TextBox box1 = (TextBox)Gridview1.Rows[i].Cells[1].FindControl("TextBox1");
        TextBox box2 = (TextBox)Gridview1.Rows[i].Cells[2].FindControl("TextBox2");
        TextBox box3 = (TextBox)Gridview1.Rows[i].Cells[3].FindControl("TextBox3");
        dtCurrentTable.Rows[i]["Column1"] = box1.Text;
        dtCurrentTable.Rows[i]["Column2"] = box2.Text;
        dtCurrentTable.Rows[i]["Column3"] = box3.Text;
    }

    // 第二步:删除目标行
    int deleteIndex = Gridview1.SelectedIndex;
    dtCurrentTable.Rows[deleteIndex].Delete();
    dtCurrentTable.AcceptChanges();

    // 可选:重置行号为连续序号,避免删除后行号跳号
    for (int i = 0; i < dtCurrentTable.Rows.Count; i++)
    {
        dtCurrentTable.Rows[i]["RowNumber"] = i + 1;
    }

    // 第三步:更新ViewState并重新绑定
    ViewState["CurrentTable"] = dtCurrentTable;
    Gridview1.DataSource = dtCurrentTable;
    Gridview1.DataBind();

    // 第四步:回填所有行的输入值
    SetPreviousData();
}

修改后删除行时会先保存所有用户已输入的内容,再执行删除操作,其余行的内容就不会丢失了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 18:39:04