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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:36:06