C# DevExpress如何实现双击将GridView选中产品转移到另一个GridView
GridView 双击条目转移数据到另一个GridView 实现方案
以下分两种常见开发环境给出可直接复用的实现逻辑:
场景1:WinForm 环境实现
- 第一步:提前定义第二个GridView的可编辑数据源,保持列结构和第一个GridView一致
初始化代码示例:// 全局定义第二个GridView的数据源 DataTable selectedProductDt = new DataTable(); private void Form1_Load(object sender, EventArgs e) { // 初始化选中产品表列,可根据实际业务调整字段 selectedProductDt.Columns.Add("产品ID", typeof(int)); selectedProductDt.Columns.Add("产品名称", typeof(string)); selectedProductDt.Columns.Add("单价", typeof(decimal)); gridView2.DataSource = selectedProductDt; // 绑定第一个GridView的全量产品数据源,替换为你实际的业务查询逻辑即可 gridView1.DataSource = GetAllProductList(); } - 第二步:给第一个GridView绑定双击事件,处理数据转移逻辑
事件代码示例:private void gridView1_DoubleClick(object sender, EventArgs e) { // 校验是否选中有效行 if (gridView1.CurrentRow == null || gridView1.CurrentRow.IsNewRow) return; // 获取选中行的产品数据 DataRowView selectedRow = (DataRowView)gridView1.CurrentRow.DataBoundItem; // 可选:避免重复添加同一款产品 bool isExist = selectedProductDt.AsEnumerable() .Any(r => r.Field<int>("产品ID") == (int)selectedRow["产品ID"]); if (isExist) { MessageBox.Show("该产品已在选中列表中"); return; } // 写入第二个GridView的数据源 DataRow newRow = selectedProductDt.NewRow(); newRow["产品ID"] = selectedRow["产品ID"]; newRow["产品名称"] = selectedRow["产品名称"]; newRow["单价"] = selectedRow["单价"]; selectedProductDt.Rows.Add(newRow); // 可选:如果需要添加后从全量列表移除该产品,打开下方注释即可 // (gridView1.DataSource as DataTable).Rows.Remove(selectedRow.Row); }
场景2:ASP.NET Web Forms 环境实现
Web环境为无状态模式,需要配合前端JS+后端存储实现:
- 第一步:前端页面代码示例
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" onrowdatabound="GridView1_RowDataBound"> <Columns> <asp:BoundField DataField="产品ID" HeaderText="产品ID" /> <asp:BoundField DataField="产品名称" HeaderText="产品名称" /> <asp:BoundField DataField="单价" HeaderText="单价" /> </Columns> </asp:GridView> <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"> <Columns> <asp:BoundField DataField="产品ID" HeaderText="产品ID" /> <asp:BoundField DataField="产品名称" HeaderText="产品名称" /> <asp:BoundField DataField="单价" HeaderText="单价" /> </Columns> </asp:GridView> <!-- 隐藏控件用于传递选中产品ID、触发后端逻辑 --> <asp:HiddenField ID="hfSelectedPid" runat="server" /> <asp:Button ID="btnAdd" runat="server" OnClick="btnAdd_Click" style="display:none" /> - 第二步:给GridView1行绑定双击事件
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { int pid = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "产品ID")); // 绑定双击事件,传递选中ID后触发隐藏按钮的提交逻辑 e.Row.Attributes.Add("ondblclick", $"document.getElementById('{hfSelectedPid.ClientID}').value={pid};document.getElementById('{btnAdd.ClientID}').click();"); e.Row.Style.Add("cursor", "pointer"); } } - 第三步:后端处理数据转移逻辑,用Session/ViewState持久化第二个GridView的数据源
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 绑定全量产品列表 GridView1.DataSource = GetAllProductList(); GridView1.DataBind(); // 初始化选中产品列表 DataTable dt = new DataTable(); dt.Columns.Add("产品ID", typeof(int)); dt.Columns.Add("产品名称", typeof(string)); dt.Columns.Add("单价", typeof(decimal)); Session["SelectedProducts"] = dt; GridView2.DataSource = dt; GridView2.DataBind(); } } protected void btnAdd_Click(object sender, EventArgs e) { int pid = Convert.ToInt32(hfSelectedPid.Value); // 根据ID查询产品完整信息,替换为实际业务逻辑即可 DataRow product = GetProductById(pid); DataTable selectedDt = Session["SelectedProducts"] as DataTable; // 可自行添加重复判断逻辑 DataRow newRow = selectedDt.NewRow(); newRow["产品ID"] = product["产品ID"]; newRow["产品名称"] = product["产品名称"]; newRow["单价"] = product["单价"]; selectedDt.Rows.Add(newRow); Session["SelectedProducts"] = selectedDt; GridView2.DataSource = selectedDt; GridView2.DataBind(); }
内容的提问来源于stack exchange,提问作者Sinem Hür
相关产品推荐
相关产品推荐

