C# 两个DataGridView数据移动问题需求: 
 1、选择上部DataGridView药品信息后,点击分配按钮,上部DataGridView所选药品信息去除,增加到下部DataGridView中(分配按钮)
 2、选择下部DataGridView药品信息后,点击撤消分配按钮,下部DataGridView所选药品信息去除,增加到上部DataGridView中(撤消分配按钮) 

解决方案 »

  1.   

    在上下两个DataGridView所绑定的数据源中操作,根据选中的数据的ID,在数据绑定数据源中做增加删除数据行操作,然后重新绑定数据。
      

  2.   

    如果用Datatable作数据源的话就比较简单了,直接修改两个table中的数据,重新绑定就可以了
      

  3.   

    解决办法源代码如下:
             ArrayList AL = new ArrayList();
            ArrayList ALDetail = new ArrayList();
     #region 明细表datagridview 事件
            private void dgvDocSaleD_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                try
                {
                    if (this.dgvDocSaleD.Rows.Count > 0)
                    {                    if (e.ColumnIndex == 0 && e.RowIndex != -1)
                        {
                            if (this.dgvDocSaleD.Rows[e.RowIndex].Cells[0].EditedFormattedValue.ToString() == "True")
                            {
                                ALDetail.Add(dgvDocSaleD.SelectedRows[0].Cells["MedID"].Value.ToString());
                            }
                            else
                            {
                                return;
                            }                    }
                    }
                }
                catch (Exception ex)
                {
                    CommonFun.Message_Error(ex.Message);
                }
            }
            #endregion        #region 分配事件
            private void Allot()
            {
                try
                {
                    //获取所选药品主键
                    string strItems = null;                if (AL.Count > 0)
                    {
                        foreach (Object obj in AL)
                        {
                            strItems += obj.ToString() + ",";
                        }                    //去除最后一个","
                        strItems = strItems.Substring(0, strItems.Length - 1);                    //B、分配按钮事件中把上部DataGridView 数据源中相关行号的药品加入到下部 DataGridView数据源中,重新绑定下部 DataGridView数据。
                        //将所选药品添加到下部临时表中
                        AddDetailData(strItems);                    //把上部DataGridView 数据源中相关行号的药品去除,再重新绑定上部 DataGridView数据。
                        //从上部临时表中去除所选药品信息
                        SubMainData(strItems);                    //清除数组
                        AL.Clear();
                    }
                    else
                    {
                        CommonFun.Message_ExclamationOk("请选择药品信息!");
                    }
                }
                catch (Exception ex)
                {
                    CommonFun.Message_Error(ex.Message);
                }
            }
            #endregion        #region add明细表的数据
            private void AddDetailData(string DOCNO)
            {
                DataTable dt = (DataTable)dgvDocSaleM.DataSource;            DataView dv = dt.DefaultView;
                dv.RowFilter = "MedID IN (" + DOCNO + ")";            DataTable dtX = dv.ToTable();            if (dtX != null && dtX.Rows.Count > 0)
                {
                    this.dgvDocSaleD.DataSource = UniteDataTable(dtX, (DataTable)dgvDocSaleD.DataSource);
                }
            }
            #endregion        #region Sub主表的数据
            private void SubMainData(string DOCNO)
            {
                //判断是否有明细信息
                if (this.dgvDocSaleM.Rows.Count > 0)
                {
                    DataTable dt = (DataTable)dgvDocSaleM.DataSource;
                    DataView dv = dt.DefaultView;
                    //dv.RowFilter = "MedID NOT IN ( '" + DOCNO + "'" + ")";
                    dv.RowFilter = "MedID NOT IN (" + DOCNO + ")";
                    dgvDocSaleM.DataSource = dv.ToTable();
                }
                else
                {
                    //页面初始化
                    SetUIStyle();
                }
            }
            #endregion        #region 撤消分配事件
            private void UndoAllot()
            {
                try
                {
                    //获取所选药品主键
                    string strItems = null;                if (ALDetail.Count > 0)
                    {
                        foreach (Object obj in ALDetail)
                        {
                            strItems += obj.ToString() + ",";
                        }
                        //去除最后一个","
                        strItems = strItems.Substring(0, strItems.Length - 1);                    //B、撤消分配按钮事件中把下部DataGridView 数据源中相关行号的药品加入到上部 DataGridView数据源中,重新绑定上部 DataGridView数据。
                        //将所选药品添加到上部临时表中
                        AddMainData(strItems);                    //把下部DataGridView 数据源中相关行号的药品去除,再重新绑定下部 DataGridView数据。
                        //从下部临时表中去除所选药品信息
                        SubDetailData(strItems);                    //清除数组
                        ALDetail.Clear();
                    }
                    else
                    {
                        CommonFun.Message_ExclamationOk("请选择药品信息!");
                    }
                }
                catch (Exception ex)
                {
                    CommonFun.Message_Error(ex.Message);
                }
            }
            #endregion        #region add主表的数据
            private void AddMainData(string DOCNO)
            {
                DataTable dt = (DataTable)dgvDocSaleD.DataSource;            DataView dv = dt.DefaultView;
                dv.RowFilter = "MedID IN (" + DOCNO + ")";            DataTable dtX = dv.ToTable();            if (dtX != null && dtX.Rows.Count > 0)
                {
                    this.dgvDocSaleM.DataSource = UniteDataTable(dtX, (DataTable)dgvDocSaleM.DataSource);
                }
            }
            #endregion        #region Sub明细表信息
            private void SubDetailData(string DOCNO)
            {
                //判断是否有明细信息
                if (this.dgvDocSaleD.Rows.Count > 0)
                {
                    DataTable dt = (DataTable)dgvDocSaleD.DataSource;
                    DataView dv = dt.DefaultView;
                    dv.RowFilter = "MedID NOT IN (" + DOCNO + ")";
                    dgvDocSaleD.DataSource = dv.ToTable();
                }
                else
                {
                    //页面初始化
                    SetUIStyle();
                }
            }
            #endregion        #region 合并数据表
            private DataTable UniteDataTable(DataTable DataTable1, DataTable DataTable2)
            {
                DataTable newDataTable = DataTable1.Clone();            object[] obj = new object[newDataTable.Columns.Count];
                for (int i = 0; i < DataTable1.Rows.Count; i++)
                {
                    DataTable1.Rows[i].ItemArray.CopyTo(obj, 0);
                    newDataTable.Rows.Add(obj);
                }
                if (DataTable2 != null)
                {
                    for (int i = 0; i < DataTable2.Rows.Count; i++)
                    {
                        DataTable2.Rows[i].ItemArray.CopyTo(obj, 0);
                        newDataTable.Rows.Add(obj);
                    }
                }
                return newDataTable;
            }
            #endregion