/// <summary> /// 通过商品Id查找整个商品信息,返回值是ProdutsModel里面的所有数据 /// </summary> /// <param name="productId"></param> /// <returns></returns> ProdutsModel ISuperMarketProductServer.GetProductWithId(string productId) { string procName = "GetProductWithId"; //在ADO.NET里面创建参数,并给参数赋值,来给该存储过程名里传递参数 SqlParameter[] sp = { new SqlParameter("@productId", SqlDbType.NVarChar, 50) }; // 获取通过主窗口传输进来的商品ID sp[0].Value = productId; //获取多个数据用GetDataReader方法 SqlDataReader reader = SQLHelper.GetDataReader(procName, sp); ProdutsModel produt = null; while (reader.Read()) { //把数据库中获取到的所有数据并给ProdutsModel里面赋值 produt = new ProdutsModel() { ProductId = reader["ProductId"].ToString(), ProductName = reader["ProductName"].ToString(), UnitPrice = Convert.ToDecimal(reader["UnitPrice"]), Unit = reader["Unit"].ToString(), Discount = Convert.ToInt32(reader["Discount"]), CategoryId = Convert.ToInt32(reader["Categoryld"]), CategoryName = reader["CategoryName"].ToString() }; } reader.Close(); return(produt); }
/// <summary> /// 把添加商品的窗口中的数据给数据库中的商品表添加 /// 添加商品数量的存储过程 /// </summary> /// <param name="produt"></param> /// <param name="inventory"></param> /// <returns></returns> public bool InsertProduct(ProdutsModel produt, ProductInventoryModel inventory) { List <string> procList = new List <string>() { "InsertProduct", //添加商品的存储过程 "InsertInventory" //添加商品数量的存储过程 }; List <SqlParameter[]> psList = new List <SqlParameter[]>(); SqlParameter[] prodPs = new SqlParameter[] { new SqlParameter("@productId", produt.ProductId), new SqlParameter("@productName", produt.ProductName), new SqlParameter("@unitPrice", produt.UnitPrice), new SqlParameter("@unit", produt.Unit), new SqlParameter("@discount", produt.Discount), new SqlParameter("@categoryId", produt.CategoryId) }; SqlParameter[] inventPs = new SqlParameter[] { new SqlParameter("@productId", inventory.ProductId), new SqlParameter("@minCount", inventory.MinCount), new SqlParameter("@maxCount", inventory.MaxCount) }; psList.Add(prodPs); psList.Add(inventPs); return(SQLHelper.UpdateByTran(procList, psList)); }
/// <summary> /// 获取Products商品表的存储过程:根据商品Id,获取这行数据 /// </summary> /// <param name="pid"></param> /// <returns></returns> public ProdutsModel GetProductWithId(string pid) { string procName = "GetProductWithId"; SqlParameter[] sp = new SqlParameter[] { new SqlParameter("@productId", pid) }; ProdutsModel produt = null; SqlDataReader reader = SQLHelper.GetDataReader(procName, sp); while (reader.Read()) { produt = new ProdutsModel() { ProductId = reader["ProductId"].ToString(), ProductName = reader["ProductName"].ToString(), Discount = Convert.ToSingle(reader["Discount"]), CategoryId = Convert.ToInt32(reader["Categoryld"]), CategoryName = reader["CategoryName"].ToString(), Unit = reader["Unit"].ToString(), UnitPrice = Convert.ToDecimal(reader["UnitPrice"]) }; } reader.Close(); return(produt); }
/// <summary> /// 商品表修改名字、单价、商品分类、计量单位,通过Id商品编号修改商品表的内容 /// </summary> /// <param name="produts"></param> /// <returns></returns> public bool UpdateProduct(ProdutsModel produts) { if (GetManager2.UpdateProduct(produts) > 0) { return(true); } else { return(false); } }
//【2.2】 //当添加商品FrmAddProduct关闭窗体后发生, private void AddProduct_FormClosed(object sender, FormClosedEventArgs e) { //实例化添加商品窗口 FrmAddProduct添加商品 frmAdd = sender as FrmAddProduct添加商品; if (frmAdd.DialogResult == DialogResult.OK) { currentProduct = frmAdd.Tag as ProdutsModel; frmAdd.DialogResult = DialogResult.Cancel; btnIntoProduct_Click(frmAdd, null); } }
//ProdutsModel produts从商品信息维护获取数据 public FrmUpdateProduct(ProdutsModel produts) { InitializeComponent(); //商品名字获取焦点 txtProductName.Focus(); //GetCategories()获取【商品分类表中的所有数据库】并给categories商品类型泛型中添加内容 categories = manager2.GetCategories(); //GetUnit()获取【商品的计量单位从数据库中获取所有数据】并给units商品计量单位泛型中添加内容 units = manager2.GetUnit(); //【商品类型】和【商品计量单位】不能为空 if (categories.Count == 0 || units.Count == 0) { //如果【商品类型】和【商品计量单位】为空则return下面的代码不再执行 return; } source1.DataSource = categories; //cmbCategory商品类型的Combox的名字 cmbCategory.DataSource = source1; //【cmbCategory.ValueMember】和【cmbCategory.DisplayMember】分别记录一个标记,到时候数据库的商品类型表可以一一对应拿到的数据对应的标记位置 //key:CategoryId获取商品类型Id(就是给Combox里面放CategoryId的key名字,用来记录Combox的内容) cmbCategory.ValueMember = "CategoryId"; //Combox的值的显示(就是给Combox里面放CategoryName属性名字,用来记录Combox的内容) cmbCategory.DisplayMember = "CategoryName"; //获取或设置指定当前选定的索引项 cmbCategory.SelectedIndex = produts.CategoryId - 1; //【用两个封装器装【商品类型】和【商品计量单位】的数据】 source2.DataSource = units; //给Combox计量单位里面放封装器接收数据库获取的数据 cmbUnit.DataSource = source2; //Combox中对应位置放入对应的所有数据 cmbUnit.ValueMember = "Id"; cmbUnit.DisplayMember = "Unit"; //通过linq查询返回第一个Id值 cmbUnit.SelectedIndex = ((from item in units where item.Unit == produts.Unit select item.Id).FirstOrDefault() - 1); //给txtProductId.Text文本框添加Id数据produts.ProductId(通过另一个页面获取到商品Id的数据) txtProductId.Text = produts.ProductId; //给txtProductName.Text文本框添加商品名字(通过另一个页面获取到商品Id的数据) txtProductName.Text = produts.ProductName; //给txtUnitPrice.Text添加折扣的修改 txtUnitPrice.Text = produts.UnitPrice.ToString("F2"); //produts商品表内容把从另一个页面获取的值给CurrentProduct商品属性记录 CurrentProduct = produts; //把获取焦点是触发数据 txtProductId.GotFocus += TxtProductId_GotFocus; txtProductName.GotFocus += TxtProductId_GotFocus; txtUnitPrice.GotFocus += TxtProductId_GotFocus; }
/// <summary> /// 商品表修改名字、单价、商品分类、计量单位,通过Id商品编号修改商品表的内容 /// SetProductInfor存储过程名称 /// </summary> /// <param name="produts"></param> /// <returns></returns> public int UpdateProduct(ProdutsModel produts) { string procName = "SetProductInfor"; SqlParameter[] sp = { new SqlParameter("@productName", produts.ProductName), new SqlParameter("@unitPrice", produts.UnitPrice), new SqlParameter("@categoryId", produts.CategoryId), new SqlParameter("@unit", produts.Unit), new SqlParameter("@productId", produts.ProductId) }; return(SQLHelper.ExecuteNonQuery(procName, sp)); }
private void TxtProductId_LostFocus(object sender, EventArgs e) { if (txtProductId.CheckData(@"^\d+$", "商品编号录入有误") == 1) { ProdutsModel produts = manager2.GetProductWithId(txtProductId.Text.Trim()); if (produts == null) { MessageBox.Show("商品编号录入有误,未查询到对应商品!", "提示"); txtProductId.SelectAll(); txtProductId.Focus(); return; } else { txtProductName.Text = produts.ProductName; } } }
/// <summary> /// 【通过商品表的Id获取表中的内容在dgvProductList(dataGridView1)框里面显示】 /// </summary> private void AddNewProductToList() { //【一】根据商品编号查询商品 //【1.在数据库中根据商品编号查询商品】 //objProduct就拿到到所有的商品表内容 ProdutsModel objProduct = manager2.GetProductWithId(txtProductId.Text.Trim()); //【2】检查商品是否未查到,如果没有商品临时创建一个商品 //objProduct如果没有拿到值,则进入 if (objProduct == null)//商品编号未查到对应的商品信息,要么是临时商品 { //【3】假设是临时商品 objProduct = new ProdutsModel() { ProductName = "暂未提供商品名称", //商品名字 ProductId = txtProductId.Text.Trim(), //商品ID UnitPrice = Convert.ToDecimal(txtUnitPrice.Text.Trim()), //商品单价 Discount = Convert.ToInt32(txtDiscount.Text.Trim()) //商品折扣 }; } //【3】扫到的商品(就是数据库里面通过Id查到商品) else { //把从数据库获取的, 内容给窗口上的文本框 txtUnitPrice.Text = objProduct.UnitPrice.ToString(); txtDiscount.Text = objProduct.Discount.ToString(); } //【5】根据商品的数量折扣计算小计金额 objProduct.Quantity = Convert.ToInt32(txtQuantity.Text.Trim()); objProduct.SubTotal = objProduct.Quantity * objProduct.UnitPrice; //【6】如果这个商品有折扣 if (objProduct.Discount != 0) { objProduct.SubTotal *= (Convert.ToDecimal(objProduct.Discount) / 10); } //【7】商品列表序号问题(每次添加序号改变,增加一个) objProduct.ProductNo = productList.Count + 1; productList.Add(objProduct); //【8】添加商品之后应该立刻让最新添加的商品作为选中项 //bs是缓冲容器的名字,MoveLast()是获取移至列表中的最后一项 bs.MoveLast(); }
/// <summary> /// 添加商品 /// (1)根据商品Id添加新商品 /// (2)新加的Id不能和数据库Id重复 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnAddProduct_Click(object sender, EventArgs e) { //判断每个文本框是否是正确的,如果不正确直接return下面不在执行 if (txtProductId.CheckData("^\\d+$", "商品编号必须是至少6位数字") * txtProductName.CheckNullOrEmpty() * txtProductUnitprice.CheckData(@"^(([1-9]\d*)|(\d*.\d{1,2}))$", "输入金额有误") * txtDiscount.CheckData(@"^((\d)|(\d.\d))$", "折扣输入有误") * txtMinCount.CheckData(@"^\d+$", "最小库存输入有误") * txtMaxCount.CheckData(@"^\d+$", "最大库存输入有误") == 0) { return; } else { //【一】当录入商品的时候要做一些判断:判断商品编号必须是唯一的,其二判断商品的名称必须是唯一的 //productList获取数据库中商品表的所有内容 List <ProdutsModel> productList = manager2.GetAllProduct(); var obj1 = from objPro in productList where objPro.ProductId == txtProductId.Text select objPro; //【1】商品的编号不能重复;判断商品编号必须是唯一的 if (obj1.Count() > 0) { MessageBox.Show("商品编号已经存在,请重新录入!", "提示"); txtProductId.SelectAll(); return; } //判断数据库中所有商品名objPro.ProductName是否==txtProductName.Text里面的名字有相同的 //productList获取商品的所有名字;获取数据库中商品表的所有内容 var obj2 = from objPro in productList where objPro.ProductName == txtProductName.Text select objPro; //【3】断商品的名称必须是唯一的;obj2.Count() > 0表示有重复的名字 if (obj2.Count() > 0) { MessageBox.Show("商品名称已经存在,请重新录入!", "提示"); txtProductName.SelectAll(); return; } //判断最大库存量不能小于最小库存量 if (int.Parse(txtMinCount.Text) > int.Parse(txtMaxCount.Text)) { MessageBox.Show("最大库存量不能小于最小库存量", "提示"); return; } else//【二】添加商品 { //cmbUnit.SelectedValue单位是否==和数据库中的单位相同 var pu = from item in units where item.Id == Convert.ToInt32(cmbUnit.SelectedValue) select item; //商品表 ProdutsModel produts = new ProdutsModel() { ProductId = txtProductId.Text.Trim(), ProductName = txtProductName.Text.Trim(), Discount = Convert.ToSingle(txtDiscount.Text.Trim()), UnitPrice = Convert.ToDecimal(txtProductUnitprice.Text.Trim()), CategoryId = Convert.ToInt32(cmbCategory.SelectedValue), Unit = pu.FirstOrDefault().Unit }; //商品数量表 ProductInventoryModel inventory = new ProductInventoryModel() { ProductId = txtProductId.Text.Trim(), MinCount = Convert.ToInt32(txtMinCount.Text.Trim()), MaxCount = Convert.ToInt32(txtMaxCount.Text.Trim()) }; //获取商品表和商品数量表 bool res = manager2.InsertProduct(produts, inventory); if (res) { if (MessageBox.Show("添加商品成功,是否继续添加", "提示", MessageBoxButtons.OKCancel) == DialogResult.OK) { InitializeProduct(); txtProductId.Focus(); return; } else { if (MessageBox.Show("是否对该商品进行入库?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { this.DialogResult = DialogResult.OK; this.Tag = produts; } else { this.DialogResult = DialogResult.Cancel; } this.Close(); } } else { MessageBox.Show("添加商品失败!", "提示"); return; } } } }
//封装器在当前绑定项【更改时发生】 private void Source_CurrentChanged(object sender, EventArgs e) { //source是封装器名字,封装器source里面获取值了:有的商品表的所有值获取到 //获取列表中的当前项,这样就可以获取值放在CurrentProduct里面 CurrentProduct = source.Current as ProdutsModel; }
/// <summary> /// 把添加商品的窗口中的数据给数据库中的商品表添加 /// </summary> /// <param name="produt"></param> /// <param name="inventory"></param> /// <returns></returns> public bool InsertProduct(ProdutsModel produt, ProductInventoryModel inventory) { return(GetManager2.InsertProduct(produt, inventory)); }
private void BindProduct() { //商品编号正确(把换行符号改成空字符串:原因是获取时会包含换行符) txtProductId.Text = txtProductId.Text.Replace("\r\n", ""); //商品编号正确格式的验证 if (txtProductId.CheckData(@"^[1-9]\d*$", "商品编号为10-15纯数字") != 0) { //【1】查询对应的商品的详细信息 //【2】检查这个商品是否已经在购物车中存在了,如果已经有了这个商品则直接添加数量,如果没有才往购物车中添加 //【3】product记录获取的值,在productList中获取,Id对应的值 //【4】p.ProductId.Equals(txtProductId.Text.Trim())值并确定这个Id是否有相同的值 //【5】product接收这个值 var product = from p in productList where p.ProductId.Equals(txtProductId.Text.Trim()) select p; //在购物车中未找到该商品,则进行重新添加 if (product.Count() == 0)//product.Count()泛型里面的内容总数 { //第一次添加数据库数据,肯定dgvProductList(dataGridView1)没有任何值,所以第一次添加数据进入这里AddNewProductToList,productList就会有数据了 //【通过商品表的Id获取表中的内容在dgvProductList(dataGridView1)框里面显示】 AddNewProductToList(); } else//商品已经存在,则只需要更新数量和小计金额即可 { //product如果有多个Id相同的商品,只返回序列的第一个值 ProdutsModel pro = product.FirstOrDefault(); //并在Quantity商品数量对应的文本框累加1,赋给pro.Quantity里面,现在productList里面就有值了 pro.Quantity += Convert.ToInt32(txtQuantity.Text.Trim()); //pro.SubTotal记录总钱数(已有的数量*单价) pro.SubTotal = pro.Quantity * pro.UnitPrice; //打折的位置是否为空 if (pro.Discount != 0) { //不为空进来打折,把打折后的钱赋给 pro.SubTotal记录总钱数 pro.SubTotal *= (Convert.ToDecimal(pro.Discount) / 10); } } //【3】整个商品加入购物车完成,刷新界面显示 //先把productList数据放在BindingSource缓冲容器里面,防止直接删除数据报错 bs.DataSource = productList; //清空原来的数据,方便下一次添加 dgvProductList.DataSource = null; //从新添加数据 dgvProductList.DataSource = bs; //【重点:下面的4、5表示给主窗口添加商品数据后全部恢复初始化】 //【4】更新购物车的应付金额数量 txtPay.Text = (from p in productList select p.SubTotal).Sum().ToString(); //【5】清空商品的相关信息 txtProductId.Text = ""; txtQuantity.Text = "1"; txtDiscount.Text = "0"; txtUnitPrice.Text = "0.00"; txtAmount.Text = "0.00"; txtChange.Text = "0.00"; txtProductId.Focus(); } else { MessageBox.Show("商品编号为10-15纯数字", "错误编号"); } }