【乾貨分享】一些基於DevExpress Grid實現的界面處理功能(下)

DevExpress的GridControl控件能夠提供很多強大的操作,其視圖GridView能夠通過各種設置,呈現出多種複雜的界面效果,本篇隨筆探討一些常見的GridControl控件及其GridView的視圖操作處理,以便在大家也需要的時候作爲一個參考的代碼。其中設計一些常見的操作,如合併單元格、彙總統計、複製粘貼行、導入數據處理、導出Excel、導出PDF等、打印GridView視圖、內置插入及保存數據處理等等。

在上文中(點擊這裏回顧>> )我們爲大家講解了如何合併單元格、彙總統計處理、內置的導出Excel處理等,本文中將繼續講解如何打印當前GridView視圖、彈出GridView自定義菜單等。

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

五、打印當前GridView視圖

GridView本身也提供了直接打印的操作方法,如果對一些簡單的表格,可以直接使用它進行打印當前視圖處理。

currentView.GridControl.ShowRibbonPrintPreview();

這樣的打印效果,呈現出一個Ribbon的報表預覽界面,然後直接在上面進行定製打印的格式。

【乾貨分享】一些基於DevExpress GridControl實現的界面處理功能(上)

或者我們也可以在生成打印預覽的時候,指定更多的定製信息,如下界面所示。

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 + " -- " + "備件信息報表";
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);
}

類似的打印預覽的界面效果如下所示。

【乾貨分享】一些基於DevExpress GridControl實現的界面處理功能(上)

當然我們也可以利用第三方控件的打印處理來實現更多的效果,不過內置的GridView打印操作,基本上也能滿足大多數的要求了。

六、彈出GridView自定義菜單

GridView的右鍵菜單,可以用ContextMenuStrip的常規性菜單控件來定義,我分頁控件中就是採用這樣的方式,設置比較簡單,只需要設置GridCtrol控件的ContextMenuStrip屬性即可,如下代碼所示。

this.gridControl1.ContextMenuStrip = this.contextMenuStrip1;

並且通過ContextMenuStrip的Opening事件,可以對它進行一定的設置禁用/可用的處理。

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的右鍵進行綁定及權限的設置處理,類似下面的界面效果所示。

【乾貨分享】一些基於DevExpress GridControl實現的界面處理功能(上)

雖然利用ContextMenuStrip的傳統菜單條,可以很好、方便的實現右鍵菜單的處理,不過缺點是樣式沒有隨着DevExpress本身的效果變化,如果需要追求一樣的樣式體驗,那麼可以考慮使用DevExpress的PopupMenu控件來承載菜單或者Ribbon的一些按鈕操作。

PopupMenu控件可以指定Ribbon窗體控件,然後它們右鍵菜單和Ribbon的按鈕集合同樣的出現和隱藏。

【乾貨分享】一些基於DevExpress GridControl實現的界面處理功能(上)

然後在設計模式下設計對應的菜單項目集合。

【乾貨分享】一些基於DevExpress GridControl實現的界面處理功能(上)

在界面設計好Ribbon的按鈕和菜單對象的按鈕後,我們可以爲菜單綁定對應的GridControl事件處理,讓它結合GridControl的右鍵事件出現右鍵菜單。

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);
}
}
【乾貨分享】一些基於DevExpress GridControl實現的界面處理功能(上)

七、直接新增保存的處理

在之前的文章中分別介紹了兩種不同方式的數據直接在GridView列表中處理的方式,本質上兩者是一致的,都是利用GridView本身的一些事件進行操作,實現更加方便的數據錄入體驗。

我們一般通過 InitNewRow 、ValidateRow 、CellValueChanged來處理數據的錄入操作,如下詳細操作的界面代碼所示。

private void RegisterEvent()
{
var grd = this.gridControl1;
var grv = this.gridView1;
grv.InitGridView(GridType.NewItem, false, EditorShowMode.MouseDownFocused, "");
//創建顯示的列
grv.CreateColumn("ItemNo", "備件編號", 120).CreateButtonEdit().ButtonClick += (s, e) =>
{
#region 選取備件信息,返回後賦值當前記錄
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);//默認數量爲1
}
}
#endregion
};
grv.CreateColumn("ItemName", "備件名稱", 120);
grv.CreateColumn("Quantity", "數量").CreateSpinEdit();
grv.CreateColumn("ItemBigType", "備件屬類", 120);
grv.CreateColumn("ItemType", "備件類別", 120);
grv.CreateColumn("MapNo", "圖號");
grv.CreateColumn("Specification", "規格型號", 120);
grv.CreateColumn("Unit", "單位");
grv.CreateColumn("Price", "單價");
grv.CreateColumn("Amount", "金額");
grv.CreateColumn("Material", "材質", 120);
grv.CreateColumn("Source", "來源", 120);
grv.CreateColumn("StoragePos", "庫位", 120);
grv.CreateColumn("UsagePos", "使用位置", 120);
grv.CreateColumn("WareHouse", "所屬庫房", 120);
grv.CreateColumn("Dept", "所屬部門", 120);

//設置部分字段不可修改
var readonlyFields = "ItemName,ItemBigType,ItemType,MapNo,Specification,Unit,Price,Amount,Material,Source,UsagePos,WareHouse,Dept";
grv.SetColumnsReadOnly(readonlyFields);

//綁定數據源,否則無法新增存儲
var list = new List<ItemDetailInfo>();
var dt = DataTableHelper.ConvertToDataTable<ItemDetailInfo>(list);

//同時增加兩列在實體類屬性裏沒有的列
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的主鍵,可以初始化,以及賦值明細記錄的父ID等操作
//GridView gridView = grd.FocusedView as GridView;
//gridView.SetFocusedRowCellValue("ID", Guid.NewGuid().ToString());
};
grv.ValidateRow += delegate(object sender, ValidateRowEventArgs e)
{
//校驗一些不能爲空的字段
var result = grd.ValidateRowNull(e, new string[]
{
"ItemNo",
"ItemName",
"Quantity"
});
};
grv.CellValueChanged += (object sender, CellValueChangedEventArgs e) =>
{
//根據數量計算金額
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) =>
{
//設置特殊顏色標誌
if (e.Column.FieldName == "Quantity" )
{
e.Appearance.BackColor = Color.Moccasin;
e.Appearance.ForeColor = Color.Red;
}
};
}

而如果需要結合刪除的功能,那麼可以增加對RowDeleted的事件處理。

//行刪除操作
grv.OptionsBehavior.AllowDeleteRows = DefaultBoolean.True;
grv.RowDeleted += (s, ee) =>
{
//同時移除價格列表
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, "產品編碼");
if(info.產品編碼 == code)
{
this.gridView2.DeleteRow(i);
}
}
}
};
grv.KeyDown += (s, ee) =>
{
if (ee.KeyCode == Keys.Delete)
{
gridView1.DeleteSelectedRows();
ee.Handled = true;
}
};

以上就是在實際項目中,常用到的GridControl和GridView的常規處理方法,用好這些控件的處理,可以極大程度的提高用戶的界面體驗。


更多DevExpress線上公開課、中文教程資訊請上中文網獲取

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