明细表使用ButtonEdit选择商品资料并设置商品名称,单价等信息
如图:
基本思路:
1. 绑定ButtonEdit的Click,Validating事件。
2. 如用户Click,则打开商品查询窗体,当用户选择一个商品并关闭窗体,调用SearchStockCallBack方法设置商品资料相关字段的值。
3. 如用户输入编号,按回车时触发Validating事件,这时系统跟据bllProduct.GetDataByKey()从数据库取商品的资料,如编号正确,调用SearchStockCallBack()方法设置商品资料相关字段的值。
4. 商品名称必须为“Lookup ” 类型,因为业务单据的明细表只与商品编号关联,而商品名称是通过左联接(LEFT JOIN)查询出来的。新增的商品必须调用SearchStockCallBack方法给商品名称赋值,当存储数据后,下次修改时商品名称是LEFT JOIN查询出来的。
5. DAL层取业务单据的资料表(或主从关系的),建议将SQL封装为存储过程,DAL层不要写太多的SQL,将来不好维护。
部分源码:
private void OnStockCode_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
{
//打开商品查询窗体
frmFuzzySearch.Execute(sender as ButtonEdit, new bllProduct(), this.SearchStockCallBack);
}
//检查商品编号
private void OnStockCode_Validating(object sender, CancelEventArgs e)
{
if (this.IsAddOrEditMode == false) return;
if (string.IsNullOrEmpty((sender as ButtonEdit).Text)) return;
string stockCode = (sender as ButtonEdit).Text.Trim();
DataTable dt = new bllProduct().GetDataByKey(stockCode); //验证产品编号是否正确
if (dt.Rows.Count > 0)
this.SearchStockCallBack(dt.Rows[0]);
else
{
e.Cancel = true;
Msg.Warning("产品编号不存在!");
}
}
private void SearchStockCallBack(DataRow resultRow)
{
if (resultRow == null) return;
//给表格的字段赋值
int H = gvDetail.FocusedRowHandle;
gvDetail.SetRowCellValue(H, colD_ProductID, ConvertEx.ToString(resultRow[tb_Product.ProductID]));
gvDetail.SetRowCellValue(H, colD_ProductName, ConvertEx.ToString(resultRow[tb_Product.ProductName]));
gvDetail.SetRowCellValue(H, colD_AssyNumber, 1);
gvDetail.UpdateCurrentRow();
}
模板窗体:
参考开发框架销售订单(SO)的明细表处理机制。