using DevExpress.XtraEditors.Controls; using System.Collections.Specialized; using DevExpress.XtraGrid.Views.Base; using System.Windows.Forms; using System.Reflection; using System.ComponentModel; using System.IO; using DevExpress.XtraPivotGrid; using DevExpress.XtraPrinting; using DevExpress.XtraGrid; using System.Data; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Columns; using System.Collections.Generic; using System; using static System.Windows.Forms.Control; namespace GSBase.DataA { public enum ExcelFastType { Excel95_2003, Excel2007_More } /// /// dxGrid相关的辅助方法 /// public sealed class DXGridHelper { private const string ExtendedOfColumnWidth = "ColumnWidth"; /// /// 为表格绑定数据源 /// /// 表格控件 /// 数据表 public static void BindDataTable(GridControl gridControl, DataTable dcTable) { BindDataTable(gridControl, dcTable, null); } /// /// 为表格绑定数据源 /// /// 表格控件 /// 数据表 /// 需要隐藏的字段列表。 public static void BindDataTable(GridControl gridControl, DataTable dcTable, StringCollection HideList) { if (gridControl == null || dcTable == null) return; gridControl.DataSource = null; //判断如果gridControl还未定义主视图,如果值为空则创建一个默认的视图。 if (gridControl.MainView == null) gridControl.MainView = new GridView(); GridView gv = gridControl.MainView as GridView; //清除表格中原有的列 gv.Columns.Clear(); //设置表格的样式 gv.OptionsView.ColumnAutoWidth = false; gv.OptionsView.ShowGroupPanel = false; int vi = gv.Columns.Count; //int width; vi++; List vcolumns = new List(); foreach (DataColumn col in dcTable.Columns) { //从DC中表定义的扩展属性中取出列宽属性. //width = col.MaxLength * 4; GridColumn gcol = new GridColumn(); gcol.Caption = col.Caption; //gcol.Width = width; gcol.Name = col.ColumnName; gcol.FieldName = col.ColumnName; //如果DC中定义有Width并且值大于5,表示显示此列,否则此列不显示。如是不是DC中定义的列,则获取的width值为0 if (HideList == null || HideList.IndexOf(col.ColumnName) < 0) { //检测是否为隐藏字段 gcol.VisibleIndex = vi++; } //TODO:列文本对齐方式未在扩展属性中定义,如果要设置数值类型右对刘,请在此处理 vcolumns.Add(gcol); } gv.Columns.AddRange(vcolumns.ToArray()); gridControl.DataSource = dcTable; //让所有的列调整为合适的列宽。 gv.BestFitColumns(); } /// /// 获取数据列的默认值宽度。 /// /// 数据列。 /// public static int GetExtendedOfColumnWidth(DataColumn column) { string widthObj = GetColumnExtendedProperty(column, "ColumnWidth"); return (widthObj != null || widthObj == string.Empty) ? Convert.ToInt32(widthObj) : 100; } /// /// 得到列的扩展属性值 /// /// 数据列 /// 扩展属性名称 /// 返回属性值 public static string GetColumnExtendedProperty(DataColumn column, string extendedName) { object val = null; if (column.ExtendedProperties.ContainsKey(extendedName)) val = column.ExtendedProperties[extendedName]; if (val != null) return val.ToString(); else return null; } /// /// 得到多选表格的数据行 /// public static List getSelectedHeader(GridView View) { int[] selected = View.GetSelectedRows(); List result = new List(); if (selected == null || selected.Length < 1) { DataRow row = View.GetFocusedDataRow(); if (row == null) { return null; } result.Add(row); } foreach (int i in selected) { result.Add(View.GetDataRow(i)); } return result; } /// /// 把字段绑定到ComboBoxItemCollection /// /// 数据表 /// 字段名 /// 集合 public static void LoadFieldToItems(DataTable Table, string FieldName, ComboBoxItemCollection Items) { if (Table == null || FieldName == null || FieldName == "" || Items == null) return; //把当前字段加入Items Items.Clear(); foreach (DataRow Row in Table.Rows) { Items.Add(Row[FieldName].ToString()); } } /// /// 冻结网络中的列,从第n个进行冻结 /// /// 网格 /// 冻结的开始列 /// public static bool FixGridColumn(GridView gv, int startCol) { if (startCol <= 0) return false; //先取消所有冻结 for (int i = 0; i <= gv.Columns.Count - 1; i++) { gv.Columns[i].Fixed = DevExpress.XtraGrid.Columns.FixedStyle.None; } //冻结 for (int i = 0; i <= startCol; i++) { gv.Columns[i].Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left; } return true; } /// /// 设置表格为只读,并将对应的列设置为非只读 /// /// 表格视图 /// 列集合名称,用逗号或分号隔开 /// public static bool SetGridColReadOnly(GridView View, string colName) { View.OptionsBehavior.ReadOnly = false; for (int i = 0; i < View.Columns.Count; i++) { View.Columns[i].OptionsColumn.ReadOnly = true; } if (!string.IsNullOrEmpty(colName)) { string[] cols = colName.Split(new char[2] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); foreach (string col in cols) { View.Columns[col].OptionsColumn.ReadOnly = false; } } return true; } ///// ///// 保存数据时提交表格的修改 ///// ///// The control list. ///// 窗口名称 ///// 样式类型."Save","Recover" ///// The typename. //public static void OperateStyle(ControlCollection ControlList, string FormName, string StyleType, string typename) //{ // GridControl grid = null; // foreach (ListControl control in ControlList) // { // if (control is GridControl) // { // //提交表格的修改 // grid = (control as GridControl); // if (grid.MainView is GridView) // { // if (StyleType == "Save") // SaveStyle(grid, FormName, typename); // else // RecoverStyle(grid, FormName, typename); // } // } // else if (control.HasChildren == true) // { // //如果有下层组件,则进行递归调用。 // OperateStyle(control.Controls, FormName, StyleType, typename); // } // } //} //private const string StylePath = @"C:\\Shintech\\"; /// /// 保存样式 /// /// 表格 /// 模块编号 /// 保存类型 private static void SaveStyle(GridControl grid, string moduleid, string saveType) { string path = Application.StartupPath + "\\窗体风格\\" + moduleid + "\\" + grid.Name + "\\"; string file = saveType + "view.xml"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } grid.MainView.SaveLayoutToXml(path + file); } /// /// 恢复样式 /// /// 表格 /// 模块编号 /// 保存类型 private static void RecoverStyle(GridControl grid, string moduleid, string saveType) { //由于实装的电脑对Program Files文件夹做了权限控制。风格文件夹无法创建。 //string path = StylePath + "窗体风格\\" + moduleid + "\\" + grid.Name + "\\"; string path = Application.StartupPath + "\\窗体风格\\" + moduleid + "\\" + grid.Name + "\\"; string file = saveType + "view.xml"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } if (!File.Exists(path + file)) return; grid.MainView.RestoreLayoutFromXml(path + file); } /// /// 隐藏列 /// /// 网格 /// 列名称集合 /// public static void HideGridColumn(GridView gv, string ColNames) { string[] cols = ColNames.Split(new char[2] { ';', ',' }); foreach (string col in cols) { GridColumn gcol = gv.Columns.ColumnByFieldName(col); if (gcol == null) continue; gv.Columns[col].Visible = false; } } } /// /// 列点击开窗事件辅助方法 /// public class ColumnInputHelper { private GridView _view; /// /// GridView /// public GridView Gview { get { return _view; } set { _view = value; } } private GridColumn _column; /// /// 数据列 /// public GridColumn Column { get { return _column; } set { _column = value; } } private string _dataCatalogID; /// /// DataCataLog编号 /// public string DataCatalogID { get { return _dataCatalogID; } set { _dataCatalogID = value; } } private string _filter; /// /// 筛选条件 /// public string Filter { get { return _filter; } set { _filter = value; } } private DataTable _inputDataTable; /// /// 传入数据表,若不从DC中读取,也可直接传入数据表 /// public DataTable InputDataTable { get { return _inputDataTable; } set { _inputDataTable = value; } } private string _othermapping; /// /// 其他映射关系(用分号隔开)[Field1=字段1];[Field2=字段2] /// public string OtherMapping { get { return _othermapping; } set { _othermapping = value; } } private string _textField; /// /// 数据列对应的字段编号 /// /// public string TextField { get { return _textField; } set { _textField = value; } } private EntityClass _SelectEntity; /// /// 查询实体类 /// /// The select entity. //public EntityClass SelectEntity //{ // get { return _SelectEntity; } // set { _SelectEntity = value; } //} private bool _MutilSelect; /// /// 是否可以多选 /// /// The mutil select. public bool MutilSelect { get { return _MutilSelect; } set { _MutilSelect = value; } } private string _HideField; /// /// 隐藏字段,例如单价字段是有权限才使用的。 /// /// 需要隐藏的字段列表。如果是多个字段请用分号间隔,例如:DCB009;DCB010。 public string HideField { get { return _HideField; } set { _HideField = value; } } private bool _DuplicateCheck; /// /// 是否检测重复记录。 /// /// 如果为True表示要检测,否则不检测。 public bool DuplicateCheck { get { return _DuplicateCheck; } set { _DuplicateCheck = value; } } private bool _IsValidate; /// /// 是否检测重复记录。 /// /// 如果为True表示要检测,否则不检测。 public bool IsValidate { get { return _IsValidate; } set { _IsValidate = value; } } /// /// 构造函数 /// /// 查询实体类,主要用于查询数据库 /// DC编号 /// 额外的筛选条件 /// 映射关系,例如从品号带出品名和规格时可以这样写:[DCB005]=MBA002;[DCB006]=MBA003 /// 当前列在DC中对应的字段编号。MBA001 //public ColumnInputHelper(EntityClass entity, string datacatalog, string filter, string mapping, string textField) //{ // InitHelper(entity, datacatalog, filter, mapping, textField, false, "", false, true); //} /// /// 构造函数 /// /// 查询实体类,主要用于查询数据库 /// DC编号 /// 额外的筛选条件 /// 映射关系,例如从品号带出品名和规格时可以这样写:[DCB005]=MBA002;[DCB006]=MBA003 /// 当前列在DC中对应的字段编号。MBA001 /// 是否支持多选。因为有些单据是需要多选的。 //public ColumnInputHelper(EntityClass entity, string datacatalog, string filter, string mapping, string textField, bool MutilSelect) //{ // InitHelper(entity, datacatalog, filter, mapping, textField, MutilSelect, "", false, true); //} /// /// 构造函数 /// /// 查询实体类,主要用于查询数据库 /// DC编号 /// 额外的筛选条件 /// 映射关系,例如从品号带出品名和规格时可以这样写:[DCB005]=MBA002;[DCB006]=MBA003 /// 当前列在DC中对应的字段编号。MBA001 /// 是否支持多选。因为有些单据是需要多选的。 /// 此列是否要验证 //public ColumnInputHelper(EntityClass entity, string datacatalog, string filter, string mapping, string textField, bool MutilSelect, bool IsValidate) //{ // InitHelper(entity, datacatalog, filter, mapping, textField, MutilSelect, "", false, IsValidate); //} /// /// 构造函数 /// /// 查询实体类,主要用于查询数据库 /// DC编号 /// 额外的筛选条件 /// 映射关系,例如从品号带出品名和规格时可以这样写:[DCB005]=MBA002;[DCB006]=MBA003 /// 当前列在DC中对应的字段编号。MBA001 /// 是否支持多选。因为有些单据是需要多选的。 /// 需要隐藏的字段列表,此功能主要是支持单价权限。如果是多个字段请用分号间隔,例如:DCB009;DCB010。 //public ColumnInputHelper(EntityClass entity, string datacatalog, string filter, string mapping, // string textField, bool MutilSelect, string HideField) //{ // InitHelper(entity, datacatalog, filter, mapping, textField, MutilSelect, HideField, false, true); //} /// /// 构造函数 /// /// 查询实体类,主要用于查询数据库 /// DC编号 /// 额外的筛选条件 /// 映射关系,例如从品号带出品名和规格时可以这样写:[DCB005]=MBA002;[DCB006]=MBA003 /// 当前列在DC中对应的字段编号。MBA001 /// 是否支持多选。因为有些单据是需要多选的。 /// 需要隐藏的字段列表,此功能主要是支持单价权限。如果是多个字段请用分号间隔,例如:DCB009;DCB010。 /// 如果为真,则要检测得的记录。 //public ColumnInputHelper(EntityClass entity, string datacatalog, string filter, string mapping, // string textField, bool MutilSelect, string HideField, bool DuplicateCheck) //{ // InitHelper(entity, datacatalog, filter, mapping, textField, MutilSelect, HideField, DuplicateCheck, true); //} /// /// 初始化表格列帮助字段。 /// /// 查询实体类,主要用于查询数据库 /// DC编号 /// 额外的筛选条件 /// 映射关系,例如从品号带出品名和规格时可以这样写:[DCB005]=MBA002;[DCB006]=MBA003 /// 当前列在DC中对应的字段编号。MBA001 /// 是否支持多选。因为有些单据是需要多选的。 /// 需要隐藏的字段列表,此功能主要是支持单价权限。如果是多个字段请用分号间隔,例如:DCB009;DCB010。 /// 如果为真,则要检测重复的记录。 /// 是否验证 private void InitHelper(EntityClass entity, string datacatalog, string filter, string mapping, string textField, bool MutilSelect, string HideField, bool DuplicateCheck, bool IsValidate) { _SelectEntity = entity; _dataCatalogID = datacatalog; _filter = filter; _othermapping = mapping; _textField = textField; _MutilSelect = MutilSelect; _HideField = HideField; _DuplicateCheck = DuplicateCheck; _IsValidate = IsValidate; } } /// /// 控件反射辅助方法 /// public class ControlHelper { /// /// 根据控件名和属性名取值 /// /// 控件所在实例 /// 控件名 /// 属性名 /// 属性值 public static Object GetValueControlProperty(Object ClassInstance, string ControlName, string PropertyName) { Object Result = null; Type myType = ClassInstance.GetType(); FieldInfo myFieldInfo = myType.GetField(ControlName, BindingFlags.NonPublic | //"|"为或运算,除非两个位均为0,运算结果为0,其他运算结果均为1 BindingFlags.Instance); //如果为空则返回NULL值 if (myFieldInfo == null) return null; string ClassName = myFieldInfo.FieldType.FullName; if (ClassName == "DevExpress.XtraGrid.Views.Grid.GridView" || ClassName == "DevExpress.XtraGrid.Views.BandedGrid.AdvBandedGridView") { object obj = myFieldInfo.GetValue(ClassInstance); try { Type type = obj.GetType(); MethodInfo method = type.GetMethod("GetFocusedRowCellValue", new Type[1] { typeof(System.String) }); Result = method.Invoke(obj, new object[1] { PropertyName }); return Result; } catch (Exception ex) { MessageBox.Show(ex.Message); } } else { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(myFieldInfo.FieldType); PropertyDescriptor myProperty = properties.Find(PropertyName, false); if (myProperty == null) return null; Object ctr; ctr = myFieldInfo.GetValue(ClassInstance); try { Result = myProperty.GetValue(ctr); return Result; } catch (Exception ex) { MessageBox.Show(ex.Message); } } return Result; } /// /// 根据控件名和属性名赋值 /// /// 控件所在实例 /// 控件名 /// 属性名 /// 属性值 public static void SetValueControlProperty(Object ClassInstance, string ControlName, string PropertyName, Object Value) { Type myType = ClassInstance.GetType(); FieldInfo myFieldInfo = myType.GetField(ControlName, BindingFlags.NonPublic | BindingFlags.Instance); if (myFieldInfo == null) return; PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(myFieldInfo.FieldType); PropertyDescriptor myProperty = properties.Find(PropertyName, false); //这里设为True就不用区分大小写了 if (myProperty == null) return; Object ctr; ctr = myFieldInfo.GetValue(ClassInstance); //取得控件实例 try { myProperty.SetValue(ctr, Value.ToString()); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }