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

ASP.NET无需数据库实现双DropDownList选中后点击按钮新增GridView行

问题原因

ASP.NET Web Forms为无状态架构,每次点击提交触发页面回发后,原有页面数据都会被重置。你原有代码中每次调用BindGrid方法都会创建全新的空DataTable,仅插入当前选中的1行数据,之前提交的历史数据没有被保留,因此看起来只能添加第一行,后续提交都会覆盖旧数据。
另外原有代码直接将SelectedItem对象赋值给DataRow,会导致GridView列显示System.Web.UI.WebControls.ListItem而非实际的选项文本,也需要同步修复。

修复方案

你只需要用ViewState存储历史提交的DataTable数据,每次新增行时先取出历史数据追加新行后再绑定即可,修改后的后台核心代码如下:

using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MasalaStore
{
    public partial class Menu2 : System.Web.UI.Page
    {
        // 不需要数据库可以直接删除这行SqlConnection声明,不影响功能
        // SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["mycon"].ToString());
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void SubmitButton_Click(object sender, EventArgs e)
        {
            BindGrid();
        }
        private void BindGrid()
        {
            // 过滤未选择有效选项的提交
            if (DropDownList1.SelectedValue == "0" || DropDownList2.SelectedValue == "0")
            {
                // 可自行添加选项为空的提示逻辑
                return;
            }
            DataTable dt;
            // 从ViewState读取已保存的历史数据
            if (ViewState["MasalaData"] != null)
            {
                dt = (DataTable)ViewState["MasalaData"];
            }
            else
            {
                // 首次提交时初始化表结构
                dt = new DataTable();
                dt.Columns.Add("ITEM", typeof(string));
                dt.Columns.Add("QUANTITY", typeof(string));
                dt.Columns.Add("PRIZE", typeof(string));
            }
            // 新增当前选中的行
            DataRow dtrow = dt.NewRow();
            dtrow["ITEM"] = DropDownList1.SelectedItem.Text;
            dtrow["QUANTITY"] = DropDownList2.SelectedItem.Text;
            dtrow["PRIZE"] = "#";
            dt.Rows.Add(dtrow);
            // 将更新后的数据存回ViewState
            ViewState["MasalaData"] = dt;
            // 绑定GridView
            GridView2.DataSource = dt;
            GridView2.DataBind();
            // 重置下拉框选项
            DropDownList1.ClearSelection();
            DropDownList2.ClearSelection();
        }

        protected void OnPageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridView2.PageIndex = e.NewPageIndex;
            this.BindGrid();
        }

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if ((e.Row.Cells[1].Text).ToUpper() == "OUT OF STOCK")
                {
                    // CHANGE THE COLOR OF THE CELL.
                    e.Row.Cells[1].BackColor = System.Drawing.Color.Crimson;
                    e.Row.Cells[1].ForeColor = System.Drawing.Color.WhiteSmoke;
                }
            }
        }

        protected void ddl_onSelectIndexChanged(object sender, System.EventArgs e)
        {

        }
        // 可选:清空所有已添加行的方法
        protected void ClearBtn_Click(object sender, EventArgs e)
        {
            ViewState["MasalaData"] = null;
            GridView2.DataSource = null;
            GridView2.DataBind();
        }
    }
}

补充说明

ViewState的生命周期和当前页面一致,只要不关闭页面或强制刷新浏览器,已添加的行数据都会保留,完全符合你不需要数据库的需求。如果需要跨页面保留数据,可以把ViewState替换为Session即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 20:24:03