轉(zhuǎn)帖|使用教程|編輯:龔雪|2021-05-21 10:07:14.650|閱讀 462 次
概述:本文將探討在GridView上直接錄入數(shù)據(jù),并增加字典選擇列表的功能。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
DevExpress WinForms擁有180+組件和UI庫,能為Windows Forms平臺(tái)創(chuàng)建具有影響力的業(yè)務(wù)解決方案。DevExpress WinForms能完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序,無論是Office風(fēng)格的界面,還是分析處理大批量的業(yè)務(wù)數(shù)據(jù),它都能輕松勝任!
在這篇文章《DevExpress程序中使用Winform分頁控件錄入數(shù)據(jù)并保存》中介紹了在GridView以及在其封裝的分頁控件上做數(shù)據(jù)的直接錄入的處理,介紹情況下數(shù)據(jù)的保存和校驗(yàn)等操作,不過還沒有涉及到數(shù)據(jù)列表選擇的這種方式,而這種在項(xiàng)目應(yīng)用也是比較廣泛的一種輸入方式。本篇隨筆繼續(xù)探討在GridView上直接錄入數(shù)據(jù),并增加字典選擇列表的功能。
在之前整合的數(shù)據(jù)錄入案例里面,我們可以看到可以在列表里面直接錄入速度的便捷性,如下所示。
1. 直接在GridView上錄入并保存
2. 基于WInform分頁控件的直接錄入和保存
這種方式就是利用在Griview上對數(shù)據(jù)校驗(yàn)后進(jìn)行保存。
校驗(yàn)通過后提交數(shù)據(jù)庫,我們首先需要做的方式是定位記錄集合里面當(dāng)前的記錄,把它轉(zhuǎn)換為具體的實(shí)體類對象,然后寫入新記錄或者更新處理,如下所示。
我們下面介紹的內(nèi)容,作為數(shù)據(jù)直接錄入的補(bǔ)充,提供基于數(shù)據(jù)字典的下拉列表輸入方式。
首先我們來看看整體的效果,然后在一步步分析其中的奧秘。
例如對于性別的選擇方式。
以及基于可以搜索的下拉列表
以及多選框的數(shù)據(jù)顯示處理
或者基于按鈕選擇對話框的實(shí)現(xiàn)
這些操作能夠給列表錄入提供多樣化的選擇,也豐富了用戶的輸入模式。
那么我們?nèi)绾位贕ridView的基礎(chǔ)上實(shí)現(xiàn)這些功能呢?
首先我們基于模型構(gòu)建數(shù)據(jù)庫表,數(shù)據(jù)庫表設(shè)計(jì)如下所示。
然后基于Database2Sharp代碼生成工具生成框架底層的代碼,以及生成WInform界面代碼,生成的界面代碼其中綁定數(shù)據(jù)部分如下所示。
/// <summary> /// 綁定列表數(shù)據(jù) /// </summary> private void BindData() { //entity this.winGridViewPager1.DisplayColumns = "Name,Sex,Nationality,BirthDate,Height,Weight,City,Area,State,Favorites,Introduction,Creator,CreateTime"; this.winGridViewPager1.ColumnNameAlias = BLLFactory<Test>.Instance.GetColumnNameAlias();//字段列顯示名稱轉(zhuǎn)義 string where = GetConditionSql(); var list = BLLFactory<Test>.Instance.FindWithPager(where, this.winGridViewPager1.PagerInfo); this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<TestInfo>(list); this.winGridViewPager1.PrintTitle = "人員測試信息報(bào)表"; }
我們?yōu)榱颂砑訉?yīng)的直接錄入方式,我們需要設(shè)置其中的字典綁定,處理方式如下所示,我們通過一個(gè)函數(shù)SetRepositoryItems來封裝所需處理。
/// <summary> /// 設(shè)置GridControl對應(yīng)的下拉類別內(nèi)容,方便轉(zhuǎn)義 /// </summary> private void SetRepositoryItems(GridView gridview) { var sexList = new List<CListItem>(){new CListItem("男", "1"), new CListItem("女", "2"), new CListItem("未知", "0")}; gridview.Columns.ColumnByFieldName("Sex").CreateLookUpEdit().BindDictItems(sexList, false); gridview.Columns.ColumnByFieldName("City").CreateLookUpEdit().BindDictItems("城市"); gridview.Columns.ColumnByFieldName("Nationality").CreateSearchLookUpEdit().BindDictItems("民族"); gridview.Columns.ColumnByFieldName("Area").CreateLookUpEdit().BindDictItems("市場分區(qū)"); gridview.Columns.ColumnByFieldName("State").CreateLookUpEdit().BindDictItems("處理狀態(tài)"); gridview.Columns.ColumnByFieldName("Favorites").CreateCheckedComboBoxEdit().BindDictItems("興趣愛好"); gridview.Columns.ColumnByFieldName("Introduction").CreateMemoEdit(); gridview.Columns.ColumnByFieldName("Creator").CreateButtonEdit().ButtonClick += (object sender, ButtonPressedEventArgs e) => { FrmSelectCustomer dlg = new FrmSelectCustomer(); if(dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { if(gridview.GetFocusedRow() == null) { gridview.AddNewRow();//如果首次則增加一行 } gridview.SetFocusedRowCellValue("Creator", dlg.CustomerName); } }; gridview.OptionsBehavior.ReadOnly = false; gridview.OptionsBehavior.Editable = true; }
然后在上面的BindData函數(shù)里面加入這個(gè)方法調(diào)用即可。
SetRepositoryItems(this.winGridViewPager1.gridView1);
其中的CreateLookUpEdit、CreateSearchLookUpEdit、CreateCheckedComboBoxEdit、CreateButtonEdit等方法是框架底層進(jìn)行的內(nèi)容顯示控件的處理,為了方便作為擴(kuò)展函數(shù)直接使用的,其規(guī)則類似下面的處理方式。
/// <summary> /// 創(chuàng)建GridView的列編輯為SearchLookUpEdit /// </summary> /// <param name="gridColumn">GridColumn列對象</param> /// <returns></returns> public static RepositoryItemSearchLookUpEdit CreateSearchLookUpEdit(this GridColumn gridColumn) { RepositoryItemSearchLookUpEdit repositoryItem = new RepositoryItemSearchLookUpEdit { AutoHeight = false, NullText = "" }; gridColumn.View.GridControl.RepositoryItems.Add(repositoryItem); gridColumn.ColumnEdit = repositoryItem; return repositoryItem; }
當(dāng)然我們還需要注冊響應(yīng)的處理事件,代碼如下所示。
private void RegisterEvent() { var grd = this.winGridViewPager1.gridControl1; var grv = this.winGridViewPager1.GridView1; grv.InitGridView(GridType.NewItem, false); #region 列表處理事件 grv.InitNewRow += delegate(object sender, InitNewRowEventArgs e) { GridView gridView = grd.FocusedView as GridView; gridView.SetFocusedRowCellValue("ID", Guid.NewGuid().ToString()); gridView.SetFocusedRowCellValue("Creator", LoginUserInfo.Name); gridView.SetFocusedRowCellValue("CreateTime", DateTime.Now); }; grv.ValidateRow += delegate(object sender, ValidateRowEventArgs e) { var result = grd.ValidateRowNull(e, new string[] { "Name" }); //校驗(yàn)通過后提交數(shù)據(jù)庫 GridView gridView = grd.FocusedView as GridView; if (result) { var newInfo = grv.GetFocusedRow() as TestInfo; if (newInfo != null) { result = BLLFactory<Test>.Instance.InsertUpdate(newInfo, newInfo.ID); if (!result) { e.Valid = false; e.ErrorText = string.Format("寫入數(shù)據(jù)出錯(cuò)"); } else { base.ShowMessageAutoHide(); } } } }; #endregion }
然后在窗體初始化的時(shí)候,調(diào)用上面的注冊事件即可。
/// <summary> /// 人員測試信息 /// </summary> public partial class FrmTest : BaseDock { public FrmTest() { InitializeComponent(); InitDictItem(); this.winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged); this.winGridViewPager1.OnStartExport += new EventHandler(winGridViewPager1_OnStartExport); this.winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnEditSelected); this.winGridViewPager1.OnAddNew += new EventHandler(winGridViewPager1_OnAddNew); this.winGridViewPager1.OnDeleteSelected += new EventHandler(winGridViewPager1_OnDeleteSelected); this.winGridViewPager1.OnRefresh += new EventHandler(winGridViewPager1_OnRefresh); this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1; this.winGridViewPager1.ShowLineNumber = true; this.winGridViewPager1.BestFitColumnWith = false;//是否設(shè)置為自動(dòng)調(diào)整寬度,false為不設(shè)置 this.winGridViewPager1.gridView1.DataSourceChanged += new EventHandler(gridView1_DataSourceChanged); this.winGridViewPager1.gridView1.CustomColumnDisplayText += new DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventHandler(gridView1_CustomColumnDisplayText); this.winGridViewPager1.gridView1.RowCellStyle += new DevExpress.XtraGrid.Views.Grid.RowCellStyleEventHandler(gridView1_RowCellStyle); //關(guān)聯(lián)回車鍵進(jìn)行查詢 foreach (Control control in this.layoutControl1.Controls) { control.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp); } //注冊對應(yīng)的GridView處理事件 RegisterEvent(); }
我們在數(shù)據(jù)源變化的時(shí)候,設(shè)置好各個(gè)列的寬度,方便正常顯示內(nèi)容就很完美了。
/// <summary> /// 綁定數(shù)據(jù)后,分配各列的寬度 /// </summary> private void gridView1_DataSourceChanged(object sender, EventArgs e) { if (this.winGridViewPager1.gridView1.Columns.Count > 0 && this.winGridViewPager1.gridView1.RowCount > 0) { //統(tǒng)一設(shè)置100寬度 foreach (DevExpress.XtraGrid.Columns.GridColumn column in this.winGridViewPager1.gridView1.Columns) { column.Width = 100; } //Name,Sex,BirthDate,Height,Weight,City,Area,State,Favorites,Introduction,Creator,CreateTime //可特殊設(shè)置特別的寬度 SetGridColumWidth("BirthDate", 120); SetGridColumWidth("CreateTime", 120); SetGridColumWidth("Introduction", 200); SetGridColumWidth("Favorites", 200); } }
這樣,基于開發(fā)框架基礎(chǔ)上就完成了這種直接錄入數(shù)據(jù)的處理實(shí)現(xiàn)了,非常方便,當(dāng)然如果直接利用沒有封裝的GridView處理,基本上也是沒有太多變化,思路一樣的。
本文轉(zhuǎn)載自:
DevExpress技術(shù)交流群3:700924826 歡迎一起進(jìn)群討論
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: