Ejemplo n.º 1
0
    /// <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;
        }
    }
Ejemplo n.º 2
0
        /// <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;
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
    /// <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);
    }
Ejemplo n.º 5
0
    /// <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);
    }
Ejemplo n.º 6
0
        /// <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);
        }
Ejemplo n.º 7
0
    /// <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;
        }
    }