博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

多个datagridview之间互相传值

Posted on 2011-12-02 22:14  moss_tan_jun  阅读(1230)  评论(0编辑  收藏  举报
 一个winform程序,有两个窗体,一个是住窗体,一个是子窗体。主窗体中有一个button按钮和一个datagridview控件。点击button按钮弹出子窗体,子窗体如图:

这其中涉及到两张表,一张是生产产品的供应商信息表,一张是产品信息表。主窗体查询的是供应商信息表,子窗体左边的datagridview查询的是产品信息表。当点击中间的“=>”按钮是,把左边选中的产品添加到右边。如果左边的产品没有设置单价,则弹出一个小窗体让用户设置价格(左边datagridview隐藏了“单价”列)。并保存,在右边就要显示出来。右边也可以移除产品到左边。最后点击“确定”按钮时,右边datagridview中的数据都要保存到主窗体中的datagridview控件中。

// <summary>
        /// 保存用户选择的产品。
        /// </summary>
        public List<UMS_BASE_出品信息视图> L { get; set; }
        public string SuppGuid { get; set; }

        /// <summary>
        /// 用户选中的产品。
        /// </summary>
        /// <param name="dt">DataTable对象</param>
        public delegate void DtProductInfo(DataTable dt);
        public DtProductInfo onProductInfo;

        /// <summary>
        /// 用来保存dgv_已选产品中的数据集。
        /// </summary>
        DataTable dt = new DataTable();
        UMS_BASE_分页出品信息表 list = new UMS_BASE_分页出品信息表();

        public FrmAddProduct()
        {
            InitializeComponent();
        }

        private void FrmAddProduct_Load(object sender, EventArgs e)
        {
            dgv_产品.AutoGenerateColumns = dgv_已选产品.AutoGenerateColumns = false;
            string strGuid = "";

            try
            {
                //根据出品类别查询出品Guid。
                strGuid = cmb_产品性质.Text == "" ? "" : RestService.SelectGoodsCategory(BaseInfo.Storeguid).Where(n => n.类别 == cmb_产品性质.Text.Trim()).FirstOrDefault().GUID.ToString();

                //产品信息。
                list = RestService.SelectProducedInformationList(BaseInfo.Storeguid, 1, 22, "编码", "asc", strGuid, txt_产品.Text.Trim());
                if (list != null && list.总行数 > 0)
                {
                    dgv_产品.DataSource = list.ums_出品信息视图;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            dt.Columns.Add("品名", typeof(string));
            dt.Columns.Add("进货价", typeof(string));
            dt.Columns.Add("单价", typeof(string));
            dt.Columns.Add("GUID", typeof(string));
        }

        /// <summary>
        /// 根据产品名称或者编号查询产品信息。
        /// </summary>
        private void txt_产品_TextChanged(object sender, EventArgs e)
        {
            try
            {
                //根据出品类别查询出品Guid。
                string strGuid = cmb_产品性质.Text == "" ? "" : RestService.SelectGoodsCategory(BaseInfo.Storeguid).Where(n => n.类别 == cmb_产品性质.Text.Trim()).FirstOrDefault().GUID.ToString();

                UMS_BASE_分页出品信息表 list = RestService.SelectProducedInformationList(BaseInfo.Storeguid, 1, 22, "编码", "desc", strGuid, txt_产品.Text.Trim());
                dgv_产品.DataSource = list;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void btnChoose_Click(object sender, EventArgs e)
        {
            ChooseProduct();
        }

        /// <summary>
        /// 选择左边的产品添加到右边。
        /// </summary>
        private void ChooseProduct()
        {
            if (dgv_产品.SelectedRows.Count > 0)
            {
                try
                {
                    DataRow dr = dt.NewRow();
                    dr[0] = dgv_产品.Rows[dgv_产品.CurrentRow.Index].Cells[0].Value.ToString();
                    dr[1] = dgv_产品.Rows[dgv_产品.CurrentRow.Index].Cells[1].Value.ToString();
                    dr[2] = dgv_产品.Rows[dgv_产品.CurrentRow.Index].Cells[2].Value.ToString();
                    dr[3] = dgv_产品.Rows[dgv_产品.CurrentRow.Index].Cells[3].Value.ToString();
                    dt.Rows.Add(dr);

                    dgv_已选产品.DataSource = dt;
                    foreach (UMS_BASE_出品信息视图 ub in list.ums_出品信息视图)
                    foreach (UMS_BASE_出品信息视图 ub in list.ums_出品信息视图)
                    {
                        if (ub.品名 == dgv_产品.Rows[dgv_产品.CurrentRow.Index].Cells["品名"].Value.ToString())
                        {
                            string strGuid = "";

                            //如果价格为空,则让用户设置价格。
                            if (string.IsNullOrEmpty(dgv_产品.Rows[dgv_产品.CurrentRow.Index].Cells["零售价"].Value.ToString()))
                            {
                                strGuid = dgv_产品.Rows[dgv_产品.CurrentRow.Index].Cells["GUID"].Value.ToString();
                                FrmSetPrice frmSetprice = new FrmSetPrice();
                                frmSetprice.ProGuid = strGuid;

                                if (frmSetprice.ShowDialog() == DialogResult.OK)
                                {
                                    dr[1] = dgv_产品.Rows[dgv_产品.CurrentRow.Index].Cells["零售价"].Value.ToString();
                                }
                            }
                            break;
                        }
                    }

                   dgv_产品.DataSource = null;
                    dgv_产品.DataSource = list.ums_出品信息视图;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            else
            {
                MessageBox.Show("请选择添加的产品!");
            }
        }

        private void dgv_产品_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            ChooseProduct();
        }

        private void dgv_已选产品_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            DeleteProduct();
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            DeleteProduct();
        }

        /// <summary>
        /// 把右边的数据移除到左边。
        /// </summary>
        private void DeleteProduct()
        {
            if (dgv_已选产品.SelectedRows.Count > 0)
            {
                try
                {
                    dgv_已选产品.DataSource = dt;
                    UMS_BASE_出品信息视图 ub = new UMS_BASE_出品信息视图();
                    ub.品名 = dgv_已选产品.Rows[dgv_已选产品.CurrentRow.Index].Cells[0].Value.ToString();
                    list.ums_出品信息视图.Add(ub);
                    dgv_已选产品.Rows.Remove(dgv_已选产品.Rows[dgv_已选产品.CurrentRow.Index]);

                    dgv_产品.DataSource = null;
                    dgv_产品.DataSource = list.ums_出品信息视图;
                    dgv_产品.Refresh();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            else
            {
                MessageBox.Show("请选择要移除的产品!");
            }
        }

        /// <summary>
        /// 把要保存的产品添加到UC_SupplierFiles中。
        /// </summary>
        private void btnOk_Click(object sender, EventArgs e)
        {
            UC_SuppliersToGoods uc = new UC_SuppliersToGoods();
            uc.Show();
            if (onProductInfo != null)
            {
                onProductInfo(dt);
            }
            this.Close();
        }
    }
}

设置价格中的代码:

 private void FrmSetPrice_Load(object sender, EventArgs e)
        {
            UMS_BASE_出品信息视图 u = RestService.SelectProducedInformation(Guid.Parse(ProGuid));
            lbl_产品名称.Text = u.品名;
            lbl_产品类别.Text = u.类别名称;
        }

        /// <summary>
        /// 为产品设定价格。
        /// </summary>
        private void buttonX1_Click(object sender, EventArgs e)
        {
            UMS_Base_SuppliersGoodsInfo u = new UMS_Base_SuppliersGoodsInfo();
            u.F_Price = decimal.Parse(txt_价格.Text.Trim());

            try
            {
                RestService.InsertSuppliersGoodsInfo(u);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            this.DialogResult = DialogResult.OK;
        }

代码中有一些问题,望各位指正。实现开始说的目的,也可以用其他的方法,在这里只是提供一个参考方法。