/// <summary> /// 单元格数据验证 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private static void grid_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { DataGridView dv = (DataGridView)sender; DataGridViewCell dc = dv[e.ColumnIndex, e.RowIndex]; DataTable dt = (DataTable)dv.DataSource; string s = e.FormattedValue.ToString(); if (e.ColumnIndex > dt.Columns.Count || e.RowIndex > dt.Rows.Count) { return; } if (string.IsNullOrEmpty(s)) { dv.Rows[e.RowIndex].ErrorText = null; return; } //是按钮,跳过 if (DataTableSerializer.IsDataGridViewButton(dv.Columns[e.ColumnIndex].GetType())) { return; } try { //特殊处理枚举 if (DataTableSerializer.IsEnum(dt.Columns[e.ColumnIndex].DataType)) { Type enumType = dt.Columns[e.ColumnIndex].DataType; string[] enumNames = Enum.GetNames(enumType); // 载入事件类型中文描述 FieldInfo[] enumfields = enumType.GetFields(); for (int i = 1; i < enumfields.Length; i++) { FieldInfo f = enumfields[i]; enumNames[enumfields.Length - i - 1] = WrapperReflection.getFieldDesc(f); } if (!enumNames.Contains(s) && enumType != typeof(VOCATION)) //职业类型不做改检测,因为DESC的中文跟配置的已经不同了。。 { Trace.Error("枚举值无效!"); e.Cancel = true; } } else { Convert.ChangeType(s, dt.Columns[e.ColumnIndex].DataType); } dv.Rows[e.RowIndex].ErrorText = null; } catch (Exception) { Trace.Error("输入不合法!当前单元格类型需要:" + dc.ValueType.ToString() + ",输入值:" + e.FormattedValue.ToString() + ",请重新输入!"); dv.Rows[e.RowIndex].ErrorText = "第" + e.ColumnIndex.ToString() + "个输入不合法,类型为:" + dc.ValueType.ToString(); e.Cancel = true; } }
/// <summary> /// 构建spell用的datatable /// </summary> /// <param name="ta"></param> /// <param name="tableName"></param> private void BulidSpellDatable(ref DataTable table, string tableName) { if (null == table) { table = new DataTable(); } Type spell_data = typeof(SPELL.SPELL_DATA); FieldInfo[] fields = spell_data.GetFields(); //加入ID,Vocation: FieldInfo f0 = fields[0]; DataColumn da0 = table.Columns.Add(f0.Name, f0.FieldType); da0.Caption = WrapperReflection.getFieldDesc(f0); headerText[0] = da0.Caption; headerText[1] = f0.Name; FieldInfo f1 = fields[1]; DataColumn da1 = table.Columns.Add(f1.Name, f1.FieldType); da1.Caption = WrapperReflection.getFieldDesc(f1); headerText[0] += "," + da1.Caption; headerText[1] += "," + f1.Name; //加入备注: string caption = "备注"; string name = "strRemark"; DataColumn da2 = table.Columns.Add(name, typeof(string)); da2.Caption = caption; headerText[0] += "," + da2.Caption; headerText[1] += "," + name; //加入其它字段 for (int i = 2; i < fields.Length; i++) { FieldInfo f = fields[i]; DataColumn da = table.Columns.Add(f.Name, f.FieldType); da.Caption = WrapperReflection.getFieldDesc(f); headerText[0] += ','; headerText[1] += ','; headerText[0] += da.Caption; headerText[1] += f.Name; } //第一列是ID,不能在编辑器中编辑,所以是只读的 //ta.Columns[0].ReadOnly = true; VocationTableRowCountSet.Add(table, -1); AddTableEvent(table); table.TableName = tableName; }
private bool LoadConditionTypes() { this.conditionSelect.Columns.Add("名称", 200); Type[] types = WrapperReflection.gAssembly.GetTypes(); { string[] str = new string[2] { "-服务器", "-客户端" }; foreach (var t in types) { if (t.Name.IndexOf(WapperConditionKey1) == 0 || t.Name.IndexOf(WapperConditionKey2) >= 0) { ListViewItem item = new ListViewItem(new string[] { t.Name }); string s = t.Name.ToLower(); string ex = s.Contains("client") ? str[1]:str[0]; conditionSelect.Items.Add(WrapperReflection.getDesc(t) + ex); conditionSelectList.Add(WrapperReflection.getDesc(t) + ex); m_ConditionType.Add(t.Name, t); m_ConditionDesc_Name.Add(WrapperReflection.getDesc(t) + ex, t.Name); m_ConditionName_Desc.Add(t.Name, WrapperReflection.getDesc(t) + ex); } if (t.Name.IndexOf(WapperConditionKey1) == 0 || t.Name.IndexOf(WapperConditionKey2) >= 0) { DataTable dt = new DataTable(); FieldInfo[] fields = t.GetFields(); AddTableEvent(dt); foreach (FieldInfo f in fields) { DataColumn dc = dt.Columns.Add(f.Name, f.FieldType); dc.Caption = WrapperReflection.getFieldDesc(f); } //第一列是ID,不能在编辑器中编辑,所以是只读的 dt.Columns[0].ReadOnly = true; mConditionSet.Add(t.Name, dt); mConditionReSet.Add(dt, t.Name); } } } this.FormClosing += ConditionForm_FormClosing; ////默认选中第一个 //this.conditionSelect.Focus(); //this.conditionSelect.Items[0].Selected = true; return(true); }
/// <summary> /// 枚举名和值转换到DataTable /// </summary> /// <param name="enumType">枚举实例</param> /// <param name="key">名</param> /// <param name="val">值</param> /// <returns>DataTable</returns> public static DataTable EnumToDataTable(Type enumType, string key, string val, bool isVacation = false) { // 获取所有枚举的值 Array values = Enum.GetValues(enumType); string[] names = Enum.GetNames(enumType); // 载入事件类型中文描述 FieldInfo[] enumfields = enumType.GetFields(); for (int i = 0; i < names.Length; i++) { FieldInfo f = enumType.GetField(names[i]); //if (f.Name.Contains("MAX")) //{ // names[i] = null; //} //else if (!isVacation) { names[i] = WrapperReflection.getFieldDesc(f); } else { names[i] = vocationNameDict[names[i]]; } } DataTable dict = new DataTable(); dict.Columns.Add(new DataColumn(key, typeof(string))); dict.Columns.Add(new DataColumn(val, typeof(int))); for (int i = 0; i < values.Length; i++) { string s = names[i]; if (!string.IsNullOrEmpty(s)) { DataRow dr = dict.NewRow(); dr[key] = s; dr[val] = ((int)values.GetValue(i)); dict.Rows.Add(dr); } } return(dict); }
/// <summary> /// 枚举转为一个字典,val是枚举成员的描述,key是枚举值的字符串形式 /// </summary> /// <param name="enumType">枚举实例</param> /// <returns>字典</returns> public static Dictionary <string, string> EnumToDic(Type enumType) { Dictionary <string, string> dic = new Dictionary <string, string>(); if (IsEnum(enumType)) { // 载入事件类型中文描述 FieldInfo[] enumfields = enumType.GetFields(); string[] names = Enum.GetNames(enumType); for (int i = 0; i < names.Length; i++) { FieldInfo f = enumType.GetField(names[i]); dic.Add(f.Name, WrapperReflection.getFieldDesc(f)); } } return(dic); }
/// <summary> /// 从枚举类型和它的特性读出并返回一个键值对 /// </summary> /// <param name="enumType">Type,该参数的格式为typeof(需要读的枚举类型)</param> /// <returns>键值对</returns> public static Dictionary <int, string> GetNVCFromEnumValue(Type enumType) { Dictionary <int, string> dic = new Dictionary <int, string>(); System.Reflection.FieldInfo[] fields = enumType.GetFields(); string strText = string.Empty; int nValue = 0; foreach (System.Reflection.FieldInfo field in fields) { if (field.FieldType.IsEnum) { nValue = (int)enumType.InvokeMember(field.Name, System.Reflection.BindingFlags.GetField, null, null, null); strText = WrapperReflection.getFieldDesc(field); dic.Add(nValue, strText); } } return(dic); }
/// <summary> /// 通过DataTable来构建DataGridView /// </summary> /// <param name="grid"></param> /// <param name="ta"></param> /// <param name="structType">这个dataTable所对应的结构体类型</param> /// <param name="bOpenDataCheck">是否开启数据验证</param> public static void BuildDataGridViewFromDataTable(ref DataGridView grid, DataTable ta, Type structType = null, bool bOpenDataCheck = true) { if (null == grid) { return; } if (null == ta) { return; } if (ta.Columns.Count <= 0) { return; } //是否拥有tooltips bool bHaveToolTips = true; FieldInfo[] fields = null; if (null != structType) { fields = structType.GetFields(); if (fields.Length != ta.Columns.Count) { bHaveToolTips = false; } } else { bHaveToolTips = false; } if (grid.Columns.Count > 0) { grid.Columns.Clear(); } if (grid.Rows.Count > 0) { grid.Rows.Clear(); } //不让他自己生成列,改用手动生成 grid.AutoGenerateColumns = false; grid.EditMode = DataGridViewEditMode.EditOnEnter; grid.MultiSelect = false; //grid.AllowUserToAddRows = false; for (int i = 0; i < ta.Columns.Count; i++) { DataColumn colunm = ta.Columns[i]; Type FiledType = colunm.DataType; //枚举类型特殊处理,生成下拉框 if (DataTableSerializer.IsEnum(FiledType)) { bool isVocation = IsVocationEnum(FiledType); DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn(); col.DataSource = DataTableSerializer.EnumToDataTable(FiledType, "key", "value", isVocation); col.DisplayMember = "key"; col.ValueMember = "value"; col.HeaderText = colunm.Caption; //属性绑定使用它的列名 col.DataPropertyName = colunm.ColumnName; col.DefaultCellStyle.NullValue = "请选择"; if (bHaveToolTips) { col.ToolTipText = WrapperReflection.getFieldDesc(fields[i]); } grid.Columns.Add(col); } else { DataGridViewTextBoxColumn cel = new DataGridViewTextBoxColumn(); cel.HeaderText = colunm.Caption; //属性绑定使用它的列名 cel.DataPropertyName = colunm.ColumnName; cel.ValueType = FiledType; if (bHaveToolTips) { cel.ToolTipText = WrapperReflection.getFieldDesc(fields[i]); } grid.Columns.Add(cel); } } AddButtonToDataGridView(ref grid, DeleteButtonHeadrText, DeleteButtonHeadrText, DeleteButtonCallBack); if (bOpenDataCheck) { grid.CellValidating -= grid_CellValidating; grid.CellValidating += grid_CellValidating; } }