【DevExpress實戰教程】如何在系統中實現產品列表信息的展示和選擇?

有時候我們爲了方便,我們往往使用擴展函數的代碼方式創建很多GridView的操作功能,如上文中(點擊這裏回顧>>)介紹過多行表頭的創建及綁定處理。本文介紹在DevExpress GridView的列中,使用RepositoryItemSearchLookUpEdit控件實現產品列表信息的展示和選擇。

DevExpress擁有.NET開發需要的所有平臺控件,包含600多個UI控件、報表平臺、DevExpress Dashboard eXpressApp 框架、適用於 Visual Studio的CodeRush等一系列輔助工具。

DevExpress技術交流羣8:523159565      歡迎一起進羣討論

一、界面效果展示

例如在CRM客戶管理系統裏面,有關報價單的界面如下所示,其中爲了方便選擇報價單的產品,我們在DevExpress的GridView的列中,增加了一個RepositoryItemSearchLookUpEdit控件來承載列表信息的展示的操作。如下界面所示:

【DevExpress實戰教程】如何在系統中實現產品列表信息的展示和選擇?

如果我們是手工處理,那麼可以在GridControl的設計界面中創建所需要的列並綁定字段信息,如下所示:

【DevExpress實戰教程】如何在系統中實現產品列表信息的展示和選擇?

而對應產品名稱的字段,我們需要使用它的列編輯控件來創建一個SearchLookupEdit的控件,如下所示:

【DevExpress實戰教程】如何在系統中實現產品列表信息的展示和選擇?

然後還需要爲這個視圖創建對應的列,如下所示:

【DevExpress實戰教程】如何在系統中實現產品列表信息的展示和選擇?

手工操作看似畢竟簡單,但是不夠靈活,因此我們喜歡使用擴展函數的方式,通過代碼方式創建對應的控件以及綁定對應的字段信息,這樣可以極大的提高代碼的可維護性。

二、用擴展函數創建對應控件及綁定對應字段信息

我們對GridControl和GridView的對象,創建了一些擴展函數,以便於對控件的彈性操作。

【DevExpress實戰教程】如何在系統中實現產品列表信息的展示和選擇?

一般創建一些列的信息如下所示:

var colQuantity = grv.CreateColumn("Quantity", "銷售數量");
colQuantity.CreateSpinEdit();
grv.CreateColumn("ProductNo", "產品編碼").CreateTextEdit();

我們這裏創建報價單信息列表,以及產品信息列表的處理代碼如下所示:

/// <summary>
/// 使用代碼創建GridView的綁定以及單元格編輯控件
/// </summary>
private void InitGridView()
{
var grd = this.gridControl1;
var grv = this.gridView1;

grv.Columns.Clear();
grv.CreateColumn(Id_FieldName, Id_FieldName).Visible = false;//創建一個字段,隱藏的,存儲記錄
productNameEdit = grv.CreateColumn("ProductName", "產品名稱").CreateSearchLookUpEdit();
grv.CreateColumn("SalePrice", "銷售單價").CreateTextEdit().ReadOnly = true;

//colQuantity.AppearanceCell.BackColor = Color.Moccasin;
//colQuantity.AppearanceCell.Options.UseBackColor = true;
var colQuantity = grv.CreateColumn("Quantity", "銷售數量");
colQuantity.AppearanceCell.BackColor = Color.Moccasin;
colQuantity.AppearanceCell.Options.UseBackColor = true;
colQuantity.CreateSpinEdit();

var colNote = grv.CreateColumn("Note", "備註說明");
colNote.AppearanceCell.BackColor = Color.Moccasin;
colNote.AppearanceCell.Options.UseBackColor = true;
colNote.CreateMemoEdit();
var colExpireDate = grv.CreateColumn("ExpireDate", "過期日期");
colExpireDate.AppearanceCell.BackColor = Color.Moccasin;
colExpireDate.AppearanceCell.Options.UseBackColor = true;
colExpireDate.CreateDateEdit();

grv.CreateColumn("ProductNo", "產品編碼").CreateTextEdit();
grv.CreateColumn("MaterialCode", "物料編碼").CreateTextEdit();
grv.CreateColumn("ProductType", "產品類型").CreateTextEdit();
grv.CreateColumn("Specification", "產品規格").CreateTextEdit();
grv.CreateColumn("Model", "產品型號").CreateTextEdit();
grv.CreateColumn("Unit", "標準單位").CreateTextEdit();

grv.InitGridView(GridType.NewItem, false, EditorShowMode.MouseDownFocused, "");
grv.InitNewRow += delegate (object sender, InitNewRowEventArgs e)
{
//數據記錄初始化的時候設置
//grv.SetRowCellValue(e.RowHandle, "Id", Guid.NewGuid().ToString());
//grv.SetRowCellValue(e.RowHandle, "DictType_ID", typeId);//存儲記錄的父ID
};
grv.ShowingEditor += new CancelEventHandler(gridView1_ShowingEditor);
grv.CellValueChanged += new DevExpress.XtraGrid.Views.Base.CellValueChangedEventHandler(gridView1_CellValueChanged);
}

其中注意產品信息裏面,它使用了一個RepositoryItemSearchLookUpEdit控件。

productNameEdit = grv.CreateColumn("ProductName", "產品名稱").CreateSearchLookUpEdit();

我們把它保存在窗體的變量中,供其他部分的代碼調用創建它的視圖列信息,以及設置它的數據源等操作。

/// <summary>
/// 初始化數據字典
/// </summary>
private async void InitDictItem()
{
//初始化代碼
this.txtOrderStatus.BindDictItems("報價單狀態");

//綁定產品列表
var list = await BLLFactory<IProductService>.Instance.GetAllInUsed();
productNameEdit.BindDictItems(list, "ProductName", "Id", true, new LookUpColumnInfo[]
{
new LookUpColumnInfo() { FieldName = "ProductType", Caption = "產品類型", Width = 90},
new LookUpColumnInfo() { FieldName = "ProductName", Caption = "產品名稱", Width = 150},
new LookUpColumnInfo() { FieldName = "SalePrice", Caption = "產品單價", Width = 60},
new LookUpColumnInfo() { FieldName = "HandNo", Caption = "產品編碼", Width = 60},
new LookUpColumnInfo() { FieldName = "MaterialCode", Caption = "物料編碼", Width = 60},
new LookUpColumnInfo() { FieldName = "BarCode", Caption = "條形碼", Width = 60},
new LookUpColumnInfo() { FieldName = "Specification", Caption = "產品規格, Width = 60"},
new LookUpColumnInfo() { FieldName = "Model", Caption = "產品型號", Width = 60},
new LookUpColumnInfo() { FieldName = "Color", Caption = "顏色", Width = 60},
new LookUpColumnInfo() { FieldName = "ProductSize", Caption = "尺寸", Width = 60},
new LookUpColumnInfo() { FieldName = "Unit", Caption = "標準單位", Width = 60},
new LookUpColumnInfo() { FieldName = "Quantity", Caption = "產品數量", Width = 60},
new LookUpColumnInfo() { FieldName = "Note", Caption = "備註", Width = 120},
});
productNameEdit.View.OptionsView.ColumnAutoWidth = false;
}

上面代碼指定了編輯控件列表中的列,以及數據源信息,這樣通過擴展函數的代碼方式創建,省卻很多繁瑣的手工操作。

然後我們判斷主GridView的值變化的時候,跟蹤到產品信息,然後賦值給其他對應列的信息,這樣就可以複製產品的部分信息到列表中去了。

private async void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
{
if (e.Column.FieldName == "ProductName" && e.Value != null)
{
var info = await BLLFactory<IProductService>.Instance.GetAsync(e.Value.ToString());
if (info != null)
{
//if (info.Quantity <= 1)
//{
// MessageUtil.ShowTips(string.Format("[{0}]庫存不足,請選擇其他產品", info.ProductName));
// this.gridView1.DeleteRow(e.RowHandle);
// return;
//}

this.gridView1.SetRowCellValue(e.RowHandle, "ProductNo", info.HandNo);
this.gridView1.SetRowCellValue(e.RowHandle, "MaterialCode", info.MaterialCode);
this.gridView1.SetRowCellValue(e.RowHandle, "ProductType", info.ProductType);
this.gridView1.SetRowCellValue(e.RowHandle, "Specification", info.Specification);
this.gridView1.SetRowCellValue(e.RowHandle, "Model", info.Model);
this.gridView1.SetRowCellValue(e.RowHandle, "Unit", info.Unit);
this.gridView1.SetRowCellValue(e.RowHandle, "SalePrice", info.SalePrice);
}
else
{
this.gridView1.SetRowCellValue(e.RowHandle, "ProductNo", DBNull.Value);
this.gridView1.SetRowCellValue(e.RowHandle, "MaterialCode", DBNull.Value);
this.gridView1.SetRowCellValue(e.RowHandle, "ProductType", DBNull.Value);
this.gridView1.SetRowCellValue(e.RowHandle, "Specification", DBNull.Value);
this.gridView1.SetRowCellValue(e.RowHandle, "Model", DBNull.Value);
this.gridView1.SetRowCellValue(e.RowHandle, "Unit", DBNull.Value);
this.gridView1.SetRowCellValue(e.RowHandle, "SalePrice", DBNull.Value);

this.gridView1.SetRowCellValue(e.RowHandle, "Quantity", DBNull.Value);
this.gridView1.SetRowCellValue(e.RowHandle, "Note", DBNull.Value);
this.gridView1.SetRowCellValue(e.RowHandle, "ExpireDate", DBNull.Value);
}
}
}

在界面的保存更新操作中,我們對其中的主表和明細表進行更新處理即可,如下代碼所示。

/// <summary>
/// 編輯狀態下的數據保存
/// </summary>
/// <returns></returns>
public override async Task<bool> SaveUpdated()
{
var info = await BLLFactory<IQuotationService>.Instance.GetAsync(ID);
if (info != null)
{
SetInfo(info);

try
{
#region 更新數據
bool succeed = await BLLFactory<IQuotationService>.Instance.UpdateAsync(info);
if (succeed)
{
//可添加其他關聯操作
await SaveDetail();

return true;
}
#endregion
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
MessageDxUtil.ShowError(ex.Message);
}
}
return false;
}

以上就是使用擴展函數的方式,在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控件實現產品列表信息的展示和選擇的操作,希望能夠給你提供參考的思路。

本文轉載自:博客園 - 伍華聰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章