轉(zhuǎn)帖|使用教程|編輯:龔雪|2023-06-02 10:58:50.623|閱讀 155 次
概述:本文將為大家介紹基于DevExpress的GridControl實(shí)現(xiàn)的一些界面處理功能,歡迎下載最新版組件體驗(yàn)!
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
DevExpress的GridControl控件能夠提供很多強(qiáng)大的操作,其視圖GridView能夠通過各種設(shè)置,呈現(xiàn)出多種復(fù)雜的界面效果,本篇隨筆探討一些常見的GridControl控件及其GridView的視圖操作處理,以便在大家也需要的時(shí)候作為一個(gè)參考的代碼。其中設(shè)計(jì)一些常見的操作,如合并單元格、匯總統(tǒng)計(jì)、復(fù)制粘貼行、導(dǎo)入數(shù)據(jù)處理、導(dǎo)出Excel、導(dǎo)出PDF等、打印GridView視圖、內(nèi)置插入及保存數(shù)據(jù)處理等等。
在上文中(點(diǎn)擊這里回顧>> )我們為大家講解了如何合并單元格、匯總統(tǒng)計(jì)處理、內(nèi)置的導(dǎo)出Excel處理等,本文中將繼續(xù)講解如何打印當(dāng)前GridView視圖、彈出GridView自定義菜單等。
DevExpress技術(shù)交流群8:523159565 歡迎一起進(jìn)群討論
GridView本身也提供了直接打印的操作方法,如果對一些簡單的表格,可以直接使用它進(jìn)行打印當(dāng)前視圖處理。
currentView.GridControl.ShowRibbonPrintPreview();
這樣的打印效果,呈現(xiàn)出一個(gè)Ribbon的報(bào)表預(yù)覽界面,然后直接在上面進(jìn)行定制打印的格式。
或者我們也可以在生成打印預(yù)覽的時(shí)候,指定更多的定制信息,如下界面所示。
private void menu_PrintFixColumn_Click(object sender, EventArgs e) { this.winGridViewPager1.gridView1.OptionsPrint.EnableAppearanceEvenRow = true; using (PrintableComponentLink link = new PrintableComponentLink(new PrintingSystem())) { link.Component = this.winGridViewPager1.gridControl1; link.Landscape = true; link.PaperKind = System.Drawing.Printing.PaperKind.A3; link.CreateMarginalHeaderArea += new CreateAreaEventHandler(Link_CreateMarginalHeaderArea); link.CreateDocument(); link.ShowPreview(); } } private void Link_CreateMarginalHeaderArea(object sender, CreateAreaEventArgs e) { string title = this.AppInfo.AppUnit + " -- " + "備件信息報(bào)表"; PageInfoBrick brick = e.Graph.DrawPageInfo(PageInfo.None, title, Color.DarkBlue, new RectangleF(0, 0, 100, 21), BorderSide.None); brick.LineAlignment = BrickAlignment.Center; brick.Alignment = BrickAlignment.Center; brick.AutoWidth = true; brick.Font = new System.Drawing.Font("宋體", 11f, FontStyle.Bold); }
類似的打印預(yù)覽的界面效果如下所示。
當(dāng)然我們也可以利用第三方控件的打印處理來實(shí)現(xiàn)更多的效果,不過內(nèi)置的GridView打印操作,基本上也能滿足大多數(shù)的要求了。
GridView的右鍵菜單,可以用ContextMenuStrip的常規(guī)性菜單控件來定義,我分頁控件中就是采用這樣的方式,設(shè)置比較簡單,只需要設(shè)置GridCtrol控件的ContextMenuStrip屬性即可,如下代碼所示。
this.gridControl1.ContextMenuStrip = this.contextMenuStrip1;
并且通過ContextMenuStrip的Opening事件,可以對它進(jìn)行一定的設(shè)置禁用/可用的處理。
this.contextMenuStrip1.Opening += new CancelEventHandler(contextMenuStrip1_Opening); private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) { this.menu_Add.Visible = (this.OnAddNew != null && this.ShowAddMenu); this.menu_Delete.Visible = (this.OnDeleteSelected != null && this.ShowDeleteMenu); this.menu_Edit.Visible = (this.OnEditSelected != null && this.ShowEditMenu); this.menu_Refresh.Visible = (this.OnRefresh != null); }
這樣就可以對GridView的右鍵進(jìn)行綁定及權(quán)限的設(shè)置處理,類似下面的界面效果所示。
雖然利用ContextMenuStrip的傳統(tǒng)菜單條,可以很好、方便的實(shí)現(xiàn)右鍵菜單的處理,不過缺點(diǎn)是樣式?jīng)]有隨著DevExpress本身的效果變化,如果需要追求一樣的樣式體驗(yàn),那么可以考慮使用DevExpress的PopupMenu控件來承載菜單或者Ribbon的一些按鈕操作。
PopupMenu控件可以指定Ribbon窗體控件,然后它們右鍵菜單和Ribbon的按鈕集合同樣的出現(xiàn)和隱藏。
然后在設(shè)計(jì)模式下設(shè)計(jì)對應(yīng)的菜單項(xiàng)目集合。
在界面設(shè)計(jì)好Ribbon的按鈕和菜單對象的按鈕后,我們可以為菜單綁定對應(yīng)的GridControl事件處理,讓它結(jié)合GridControl的右鍵事件出現(xiàn)右鍵菜單。
this.gridControl.MouseUp += GridControl_MouseUp;
顯示右鍵菜單的事件代碼如下所示。
private void GridControl_MouseUp(object sender, MouseEventArgs e) { try { if (e.Button == MouseButtons.Right) { var view = gridControl.DefaultView as GridView; var info = view.CalcHitInfo(e.Location); if (info.InRowCell) { popupGridMenu.ShowPopup(gridControl.PointToScreen(e.Location)); } } } catch (Exception ex) { MessageDxUtil.ShowError(ex.Message); } }
在之前的文章中分別介紹了兩種不同方式的數(shù)據(jù)直接在GridView列表中處理的方式,本質(zhì)上兩者是一致的,都是利用GridView本身的一些事件進(jìn)行操作,實(shí)現(xiàn)更加方便的數(shù)據(jù)錄入體驗(yàn)。
我們一般通過 InitNewRow 、ValidateRow 、CellValueChanged來處理數(shù)據(jù)的錄入操作,如下詳細(xì)操作的界面代碼所示。
private void RegisterEvent() { var grd = this.gridControl1; var grv = this.gridView1; grv.InitGridView(GridType.NewItem, false, EditorShowMode.MouseDownFocused, ""); //創(chuàng)建顯示的列 grv.CreateColumn("ItemNo", "備件編號(hào)", 120).CreateButtonEdit().ButtonClick += (s, e) => { #region 選取備件信息,返回后賦值當(dāng)前記錄 if (grv.GetFocusedRow() == null) { grv.AddNewRow();//一定要增加 } FrmSelectItemDetail dlg = new FrmSelectItemDetail(); dlg.WareHouse = this.txtWareHouse.Text; if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { var info = dlg.ItemDetailInfo; if (info != null) { grv.SetFocusedRowCellValue("ItemNo", info.ItemNo); grv.SetFocusedRowCellValue("ItemName", info.ItemName); grv.SetFocusedRowCellValue("ItemBigType", info.ItemBigType); grv.SetFocusedRowCellValue("ItemType", info.ItemType); grv.SetFocusedRowCellValue("MapNo", info.MapNo); grv.SetFocusedRowCellValue("Specification", info.Specification); grv.SetFocusedRowCellValue("Unit", info.Unit); grv.SetFocusedRowCellValue("Price", info.Price); grv.SetFocusedRowCellValue("Material", info.Material); grv.SetFocusedRowCellValue("Source", info.Source); grv.SetFocusedRowCellValue("StoragePos", info.StoragePos); grv.SetFocusedRowCellValue("UsagePos", info.UsagePos); grv.SetFocusedRowCellValue("WareHouse", info.WareHouse); grv.SetFocusedRowCellValue("Dept", info.Dept); grv.SetFocusedRowCellValue("Quantity", 1);//默認(rèn)數(shù)量為1 } } #endregion }; grv.CreateColumn("ItemName", "備件名稱", 120); grv.CreateColumn("Quantity", "數(shù)量").CreateSpinEdit(); grv.CreateColumn("ItemBigType", "備件屬類", 120); grv.CreateColumn("ItemType", "備件類別", 120); grv.CreateColumn("MapNo", "圖號(hào)"); grv.CreateColumn("Specification", "規(guī)格型號(hào)", 120); grv.CreateColumn("Unit", "單位"); grv.CreateColumn("Price", "單價(jià)"); grv.CreateColumn("Amount", "金額"); grv.CreateColumn("Material", "材質(zhì)", 120); grv.CreateColumn("Source", "來源", 120); grv.CreateColumn("StoragePos", "庫位", 120); grv.CreateColumn("UsagePos", "使用位置", 120); grv.CreateColumn("WareHouse", "所屬庫房", 120); grv.CreateColumn("Dept", "所屬部門", 120); //設(shè)置部分字段不可修改 var readonlyFields = "ItemName,ItemBigType,ItemType,MapNo,Specification,Unit,Price,Amount,Material,Source,UsagePos,WareHouse,Dept"; grv.SetColumnsReadOnly(readonlyFields); //綁定數(shù)據(jù)源,否則無法新增存儲(chǔ) var list = new List<ItemDetailInfo>(); var dt = DataTableHelper.ConvertToDataTable<ItemDetailInfo>(list); //同時(shí)增加兩列在實(shí)體類屬性里沒有的列 dt.Columns.Add(new DataColumn("Quantity", typeof(int))); dt.Columns.Add(new DataColumn("Amount", typeof(decimal))); grd.DataSource = dt; grv.InitNewRow += delegate(object sender, InitNewRowEventArgs e) { //如果是GUID的主鍵,可以初始化,以及賦值明細(xì)記錄的父ID等操作 //GridView gridView = grd.FocusedView as GridView; //gridView.SetFocusedRowCellValue("ID", Guid.NewGuid().ToString()); }; grv.ValidateRow += delegate(object sender, ValidateRowEventArgs e) { //校驗(yàn)一些不能為空的字段 var result = grd.ValidateRowNull(e, new string[] { "ItemNo", "ItemName", "Quantity" }); }; grv.CellValueChanged += (object sender, CellValueChangedEventArgs e) => { //根據(jù)數(shù)量計(jì)算金額 if (e.Column.FieldName == "Quantity" && e.Value != null) { var Price = string.Concat(grv.GetFocusedRowCellValue("Price")).ToDecimal(); var Quantity = string.Concat(e.Value).ToDecimal(); grv.SetFocusedRowCellValue("Amount", Price * Quantity); } }; grv.RowCellStyle += (object sender, RowCellStyleEventArgs e) => { //設(shè)置特殊顏色標(biāo)志 if (e.Column.FieldName == "Quantity" ) { e.Appearance.BackColor = Color.Moccasin; e.Appearance.ForeColor = Color.Red; } }; }
而如果需要結(jié)合刪除的功能,那么可以增加對RowDeleted的事件處理。
//行刪除操作 grv.OptionsBehavior.AllowDeleteRows = DefaultBoolean.True; grv.RowDeleted += (s, ee) => { //同時(shí)移除價(jià)格列表 var info = ee.Row as OrderInfo; if(info != null) { this.OrderInfos.Remove(info); for (int i = 0; i < this.gridView2.RowCount; i++) { var code = (string)this.gridView2.GetRowCellValue(i, "產(chǎn)品編碼"); if(info.產(chǎn)品編碼 == code) { this.gridView2.DeleteRow(i); } } } }; grv.KeyDown += (s, ee) => { if (ee.KeyCode == Keys.Delete) { gridView1.DeleteSelectedRows(); ee.Handled = true; } };
以上就是在實(shí)際項(xiàng)目中,常用到的GridControl和GridView的常規(guī)處理方法,用好這些控件的處理,可以極大程度的提高用戶的界面體驗(yàn)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)