摘要:本文档详细介绍了《看潮企业管理软件》中数据字典功能的设计与实现。基于C# WinForms与DevExpress XtraGrid控件构建的设计器,配合PostgreSQL存储过程实现数据字典的自动化管理。系统支持字段属性的可视化配置、智能版本继承、动态编辑器分配,并能自动生成C#实体类、DTO及PostgreSQL建表语句。通过元数据标准化管理,有效解决了企业信息系统中的数据一致性、开发效率、界面标准化及系统维护等核心问题,为ERP系统的长期稳定演进提供了基础设施保障。

关键词:数据字典、元数据管理、ERP系统、XtraGrid、DevExpress、PostgreSQL、代码生成、数据一致性、动态编辑器、版本继承

人工智能助手:DeepSeek、Kimi


通过实际的功能设计来了解数据字典及其处理。

一、设计器代码

using DevExpress.Utils;
using DevExpress.Utils.Menu;
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Views.Grid;
using System;
using System.Data;
using System.Windows.Forms;
using static KcErp.KcEditgd;
using static KcErp.KcMain;

namespace KcErp
{
    public partial class FmSjzd : DevExpress.XtraEditors.XtraForm
    {
        #region "fields"
        public DataTable dtgnlb;
        public int flds1 = 9;
        public string gnmc;
        public int keys1 = 3;
        public string name1 = "x9_sjzd";
        public Form ofm;
        public string prfm = "";
        public string ttbmc = "";
        public short ttxz = 0;
        public string tzdbb = "1501";
        public string tzdlb = "";
        private string[] colcaption = new string[21];
        private DataTable dtzd = new DataTable();
        private GridView gdgv = new GridView();
        private RepositoryItemComboBox ricombo1 = new RepositoryItemComboBox();
        //文本
        private RepositoryItemComboBox ricombo2 = new RepositoryItemComboBox();
        //整型
        private RepositoryItemComboBox ricombo3 = new RepositoryItemComboBox();
        //实数
        private RepositoryItemComboBox ricombo4 = new RepositoryItemComboBox();
        //日期
        private RepositoryItemComboBox ricombo5 = new RepositoryItemComboBox();
        private RepositoryItemComboBox ricombof = new RepositoryItemComboBox();
        //逻辑
        private RepositoryItemComboBox ricombom = new RepositoryItemComboBox();
        //masktype
        //formattype
        private RepositoryItemComboBox ricombos = new RepositoryItemComboBox();
        //数据字典
        private bool sftj;
        private bool sfzr;
        private string sqltj; 
        #endregion

        public FmSjzd()
        {
            InitializeComponent();
            this.Load += Form_load;
            this.FormClosing += Form_formclosing;
            this.Disposed += Form_disposed;
            this.Deactivate += Form_deactivate;
            BarZR.ItemClick += Barbuttonitem3_itemclick;
            BarTJ.ItemClick += Barbuttonitem4_itemclick;
            BarHELP.ItemClick += Barhelp_itemclick;
            BarEXIT.ItemClick += Barexit_itemclick;
            BarDY.ItemClick += Bardy_itemclick;
            BarF2.ItemClick += Barf2_itemclick;
            BarDEL.ItemClick += Bardel_itemclick;
            CBE2.SelectedIndexChanged += Cbe2_selectedindexchanged;
            ButtonRF.Click += Buttonrf_click;
            ButtonCZ.Click += Buttoncz_click;
            ButtonWB.Click += Buttonwb_click;
            ButtonpPG.Click += Buttonppg_click;

        }

        private static string Dxkt(string str)
        {
            if (str.Length > 1)
            {
                return str.Substring(0, 1).ToUpper() + str.Substring(1).ToLower();
            }
            else
            {
                return str.ToUpper();
            }
        }
        private void Barbuttonitem3_itemclick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Dtzr("0");
        }
        private void Barbuttonitem4_itemclick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Dttj();
        }
        private void Bardel_itemclick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (gdgv.RowCount <= 0)
            {
                return;
            }
            if (gdgv.FocusedColumn.ReadOnly || (!gdgv.FocusedColumn.OptionsColumn.AllowEdit))
            {
                return;
            }
            try
            {
                int colxh = gdgv.FocusedColumn.VisibleIndex;
                if ((colxh < 13))
                {
                    return;
                }
                string tpname = gdgv.FocusedColumn.ColumnType.Name;
                if (tpname.ToLower() != "string")
                {
                    return;
                }
                if (MsgSfShow("确定要清空此列,本操作只限字符串列!") != DialogResult.OK)
                {
                    return;
                }
                for (int r = 0; r < gdgv.RowCount; r++)
                {
                    gdgv.SetRowCellValue(r, gdgv.FocusedColumn, "");
                }
            }
            catch (Exception ex)
            {
                MsgExShow("整列清空", ex.Message, ex.Source, ex.StackTrace);
            }
        }
        private void Bardy_itemclick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {
                gdgv.OptionsPrint.AllowCancelPrintExport = true;
                gdgv.OptionsPrint.PrintHeader = true;
                gdgv.OptionsPrint.RtfPageHeader = CBE2.Text;
                gdgv.ShowRibbonPrintPreview();
            }
            catch (Exception ex)
            {
                MsgExShow("打印数据字典", ex.Message, ex.Source, ex.StackTrace);
            }
        }
        private void Barexit_itemclick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            SaveFmSet();
            this.Close();
        }
        private void Barf2_itemclick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {
                if (gdgv.RowCount <= 0)
                {
                    return;
                }
                if (gdgv.FocusedColumn.ReadOnly || (!gdgv.FocusedColumn.OptionsColumn.AllowEdit))
                {
                    return;
                }
                int colxh = gdgv.FocusedColumn.VisibleIndex;
                if ((colxh < 13))
                {
                    return;
                }
                string clname = gdgv.FocusedColumn.Caption;
                string tpname = gdgv.FocusedColumn.ColumnType.Name;
                string clvalue = gdgv.GetRowCellValue(gdgv.FocusedRowHandle, gdgv.FocusedColumn).ToString();
                string ipv = "";
                ipv = XtraInputBox.Show("请输入列 " + clname + " 的值,该值将被赋于所有行,请谨慎操作", "整列赋值", clvalue);
                if (string.IsNullOrEmpty(ipv))
                {
                    return;
                }
                for (int r = 0; r < gdgv.RowCount; r++)
                {
                    switch (tpname)
                    {
                        case "boolean":
                            gdgv.SetRowCellValue(r, gdgv.FocusedColumn, ipv == "true" ? 1 : 0);
                            break;
                        case "decimal":
                            gdgv.SetRowCellValue(r, gdgv.FocusedColumn, Convert.ToDecimal(ipv));
                            break;
                        case "int32":
                            gdgv.SetRowCellValue(r, gdgv.FocusedColumn, Convert.ToInt32(ipv));
                            break;
                        default:   //string
                            gdgv.SetRowCellValue(r, gdgv.FocusedColumn, ipv);
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                MsgExShow("整列赋值", ex.Message, ex.Source, ex.StackTrace);
                return;
            }
        }
        private void Barhelp_itemclick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            RunHelpsj(this, "数据字典");
        }
        private void Buttoncz_click(object sender, EventArgs e)
        {
            Dtzr("2");
        }
        private void Buttondto_click(object sender, EventArgs e)
        {
            Makemodel("dto");
        }
        private void Buttonmd_click(object sender, EventArgs e)
        {
            Makemodel("");
        }
        private void Buttonppg_click(object sender, EventArgs e)
        {
            Makepg();
        }
        private void Buttonrf_click(object sender, EventArgs e)
        {
            Dtzr("1");
        }
        private void Buttonwb_click(object sender, EventArgs e)
        {
            Maketext();
        }
        private void Cbe2_selectedindexchanged(object sender, EventArgs e)
        {
            if (sfzr && !sftj)
            {
                Dttj();
            }
            Dtzr("0");
        }
        private void Dttj()
        {
            CBE2.Focus();
            gdgv.PostEditor();
            try
            {
                KcDb.DBopen();
                DataTable dt1c = new DataTable();
                string xxstr = "";
                int xxrecord = 0;
                dt1c = dtzd.GetChanges();
                if (dt1c != null)
                {
                    xxrecord = dt1c.Rows.Count;
                    if (KcDb.GetDtSaven(name1, dt1c))
                    {
                        dtzd.AcceptChanges();
                        if (xxrecord > 0)
                        {
                            xxstr += Lzdzl.Text + "被提交" + xxrecord.ToString().Trim() + "行";
                        }
                    }
                }
                BarTJ.Enabled = false;
                if (!string.IsNullOrEmpty(xxstr.Trim()))
                {
                    MsgXxShow("数据提交已经完成" + Environment.NewLine + Environment.NewLine + xxstr);
                }
                sftj = true;
                KcDb.DBclose();
            }
            catch (Exception ex)
            {
                MsgExShow("提交数据", ex.Message, ex.Source, ex.StackTrace);
            }
        }
        private void Dtzr(string gx)
        {
            tzdbb = dtgnlb.DefaultView[CBE2.SelectedIndex]["tzdbb"].ToString();
            ttbmc = dtgnlb.DefaultView[CBE2.SelectedIndex]["tname"].ToString();
            if (string.IsNullOrEmpty(ttbmc.Trim()))
            {
                return;
            }
            try
            {
                Loadric();
                TextBB.Text = tzdbb;
                string zdexists = "select case when exists(select tname from x9_sjzd where tname='" + ttbmc +
                        "' and zdbb='" + tzdbb + "') then 'have'  else  'none' end as zdcz;";
                string exejg = KcDb.DBString(zdexists);
                if (exejg == "none")
                {
                    gx = "1";
                }
                string exsql1 = "call x9_zrsjzd('" + tzdbb + "','" + ttbmc + "'," + gx + ")";
                KcDb.DBexec(exsql1);
                string fd = "id,fxh,fname,ftype,flen,fscale,fmemo,fzmc,srlx,byxm,hsxm,alignment,edit," +
                    "formattype,formatstr,masktype,maskstr,sumtype,sumfmt,search,tooltip";
                string sqlzd = string.Format("select " + fd + " from x9_sjzd where zdbb='{0}' and tname='{1}' order by fxh", tzdbb, ttbmc);
                dtzd = KcDb.DtRead(sqlzd);
                if (dtzd != null)
                {
                    if (dtzd.Rows.Count > 0)
                    {
                        GridZD.DataSource = dtzd;
                    }
                }
                gdgv.RefreshData();
                gdgv.Focus();
                L1.Caption = tzdbb + " 数据表名:" + ttbmc + " 共" + dtzd.Rows.Count.ToString().Trim() + "行记录 ";
                sfzr = true;
                sftj = true;
                KcDb.DBclose();
            }
            catch (Exception ex)
            {
                MsgExShow("载入数据", ex.Message, ex.Source, ex.StackTrace);
            }
        }
        private void Dxmenuclick(object sender, EventArgs e)
        {
            Gvoptionwith(ref gdgv, GridZD.Width);
        }
        private void Form_deactivate(object sender, EventArgs e)
        {
            ofm.Activate();
        }
        private void Form_disposed(object sender, EventArgs e)
        {
            try
            {
                ofm = null; //form
                gnmc = null; //string '所有窗口加此属性,以便不会重复打开
                dtgnlb = null; //datatable '功能及数据表列表
                name1 = null; //string = "x9_sjzd"               '数据表名
                keys1 = 0; //integer = 3                 '主键字段数
                flds1 = 0; //integer = 9                     '更新字段数
                tzdbb = null; //string = "1501"
                ttbmc = null; //string = ""
                ttxz = 0; //int16 = 0
                sqltj = null; //string '载入条件
                dtzd = null; //new datatable      '数据字典
                sftj = false; //boolean
                sfzr = false; //boolean
                ricombo1 = null; //new repositoryitemcombobox '文本
                ricombo2 = null; //new repositoryitemcombobox '整型
                ricombo3 = null; //new repositoryitemcombobox '实数
                ricombo4 = null; //new repositoryitemcombobox '日期
                ricombo5 = null; //new repositoryitemcombobox  '逻辑
                ricombom = null; //new repositoryitemcombobox  'masktype
                ricombof = null; //new repositoryitemcombobox  'formattype
                ricombos = null; //new repositoryitemcombobox  'sumtype
                gdgv = null; //new gridview
                colcaption = null; //string
                RibbonControl = null; //devexpress.xtrabars.ribbon.ribboncontrol
                RibbonPage1 = null; //devexpress.xtrabars.ribbon.ribbonpage
                RibbonPageGroup1 = null; //devexpress.xtrabars.ribbon.ribbonpagegroup
                RibbonStatusBar = null; //devexpress.xtrabars.ribbon.ribbonstatusbar
                BarZR = null; //devexpress.xtrabars.barbuttonitem
                BarTJ = null; //devexpress.xtrabars.barbuttonitem
                Sp1 = null; //devexpress.xtraeditors.splitcontainercontrol
                GridZD = null; //devexpress.xtragrid.gridcontrol
                GridView1 = null; //devexpress.xtragrid.views.grid.gridview
                LabelControl2 = null; //devexpress.xtraeditors.labelcontrol
                CBE2 = null; //devexpress.xtraeditors.comboboxedit
                L1 = null; //devexpress.xtrabars.barstaticitem
                BarCheckItem1 = null; //devexpress.xtrabars.barcheckitem
                BarCheckItem2 = null; //devexpress.xtrabars.barcheckitem
                BarCheckItem3 = null; //devexpress.xtrabars.barcheckitem
                RepositoryItemRadioGroup1 = null; //devexpress.xtraeditors.repository.repositoryitemradiogroup
                V1 = null; //devexpress.xtrabars.barcheckitem
                V2 = null; //devexpress.xtrabars.barcheckitem
                V3 = null; //devexpress.xtrabars.barcheckitem
                BarButtonItem5 = null; //devexpress.xtrabars.barbuttonitem
                BarButtonItem6 = null; //devexpress.xtrabars.barbuttonitem
                BarButtonItem7 = null; //devexpress.xtrabars.barbuttonitem
                RibbonPageGroup3 = null; //devexpress.xtrabars.ribbon.ribbonpagegroup
                CardView1 = null; //devexpress.xtragrid.views.card.cardview
                BackgroundWorker1 = null; //system.componentmodel.backgroundworker
                BarHELP = null; //devexpress.xtrabars.barbuttonitem
                BarEXIT = null; //devexpress.xtrabars.barbuttonitem
                ButtonRF = null; //devexpress.xtraeditors.simplebutton
                TextBB = null; //devexpress.xtraeditors.textedit
                Lgnmc = null; //devexpress.xtraeditors.labelcontrol
                Lzdzl = null; //devexpress.xtraeditors.labelcontrol
                GC.Collect();
            }
            catch (Exception ex)
            {
                MsgExShow("卸载窗口对象", ex.Message, ex.Source, ex.StackTrace);
            }
        }
        private void Form_formclosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
        {
            Dttj();
        }
        private void Form_load(object sender, System.EventArgs e)
        {
            string testxh = DateTime.Now.ToString("yyyyMMdd HHmmss ffff");
            try
            {
                SetDg(this, 1800, 600, true);
                if (pCdimage.Images.Count > 0)
                {
                    foreach (BarItem item in RibbonControl.Items)
                    {
                        if (item.GetType().Name.ToLower() == "barbuttonitem")
                        {
                            if (pCdimage.Images.IndexOf(item.Caption) >= 0)
                            {
                                ((BarButtonItem)item).LargeGlyph = pCdimage.Images[item.Caption];
                            }
                        }
                    }
                }
                L1.Caption = "";
                colcaption[0] = "id";
                colcaption[1] = "序号";
                colcaption[2] = "字段名称";
                colcaption[3] = "类型";
                colcaption[4] = "长度";
                colcaption[5] = "小数";
                colcaption[6] = "标题";
                colcaption[7] = "分组";
                colcaption[8] = "输入类型";
                colcaption[9] = "必要";
                colcaption[10] = "行首";
                colcaption[11] = "对齐";
                colcaption[12] = "控件";
                colcaption[13] = "格式类型";
                colcaption[14] = "格式字符";
                colcaption[15] = "掩码类型";
                colcaption[16] = "掩码字符";
                colcaption[17] = "摘要类型";
                colcaption[18] = "摘要格式";
                colcaption[19] = "上网搜索";
                colcaption[20] = "操作提示";
                Loadgv();
                CBE2.Properties.Items.Clear();
                for (int i = 0; i < dtgnlb.Rows.Count; i++)
                {
                    CBE2.Properties.Items.Add(dtgnlb.Rows[i]["tname"].ToString() +
                        (string.IsNullOrEmpty(dtgnlb.Rows[i]["tzdbb"].ToString()) ? "" :
                        "[" + dtgnlb.Rows[i]["tzdbb"] + "]"));
                }
                BarTJ.Enabled = false;
                if (CBE2.Properties.Items.Count > 0)
                {
                    if (ttxz == 1)
                    {
                        CBE2.SelectedIndex = 1;
                    }
                    else
                    {
                        CBE2.SelectedIndex = 0;
                    }
                }
            }
            catch (Exception ex)
            {
                MsgExShow("加载程序", ex.Message, ex.Source, ex.StackTrace);
            }
            try
            {
                string fmset = FmRead(this.Text);
                string[] fmay = fmset.Split(',');
                if (fmay.Length == 6)
                {
                    if (Convert.ToInt32(fmay[0]) > 0) this.Top = Convert.ToInt32(fmay[0]);
                    if (Convert.ToInt32(fmay[1]) > 0) this.Left = Convert.ToInt32(fmay[1]);
                    if (Convert.ToInt32(fmay[2]) > 50) this.Width = Convert.ToInt32(fmay[2]);
                    if (Convert.ToInt32(fmay[3]) > 50) this.Height = Convert.ToInt32(fmay[3]);
                    if (Convert.ToInt32(fmay[4]) > 50) Sp1.SplitterPosition = Convert.ToInt32(fmay[4]);
                    if (Convert.ToInt32(fmay[5]) > 16)
                    {
                        gdgv.RowHeight = Convert.ToInt32(fmay[5]);
                    }
                }
                if (gdgv != null)
                {
                    fmset = FmRead(this.Text + "表格");
                    fmay = fmset.Split(',');
                    if (fmay.Length >= gdgv.Columns.Count)
                    {
                        for (int c = 0; c < gdgv.Columns.Count; c++)
                        {
                            int cw = Convert.ToInt32(fmay[c]);
                            if (cw <= 0)
                            {
                                gdgv.Columns[c].Visible = false;
                            }
                            else
                            {
                                gdgv.Columns[c].Width = cw;
                            }
                        }
                    }
                    else
                    {
                        Gvoptionwith(ref gdgv, GridZD.Width);
                    }
                }
            }
            catch (Exception ex)
            {
                MsgExShow("应用保存的窗口参数", ex.Message, ex.Source, ex.StackTrace);
            }
        }
        private void Gdgv_customrowcelledit(object sender, CustomRowCellEditEventArgs e)
        {
            try
            {
                if (gdgv.Columns.Count <= 0) return;
                if (e.RowHandle < 0) return;
                if (e.Column.FieldName == "edit")
                {
                    string fn = gdgv.GetRowCellValue(e.RowHandle, "srlx").ToString();
                    e.RepositoryItem = Rc(fn);
                }
                if (e.Column.FieldName == "masktype")
                {
                    string fn = gdgv.GetRowCellValue(e.RowHandle, "srlx").ToString();
                    e.RepositoryItem = Rm(fn);
                }
                if (e.Column.FieldName == "formattype")
                {
                    string fn = gdgv.GetRowCellValue(e.RowHandle, "srlx").ToString();
                    e.RepositoryItem = Rf(fn);
                }
                if (e.Column.FieldName == "sumtype")
                {
                    string fn = gdgv.GetRowCellValue(e.RowHandle, "srlx").ToString();
                    e.RepositoryItem = Rs(fn);
                }
            }
            catch (Exception) { }
        }
        private void Gvft()
        {
            Setgv(ref gdgv, true);
            gdgv.Columns[0].Visible = false;
            for (int i = 0; i < gdgv.Columns.Count; i++)
            {
                gdgv.Columns[i].Caption = colcaption[i];
                gdgv.Columns[i].OptionsColumn.ReadOnly = (i < 6);
                gdgv.Columns[i].Fixed = (i < 6) ? FixedStyle.Left : FixedStyle.None;
                gdgv.Columns[i].AppearanceHeader.Options.UseTextOptions = true;
                gdgv.Columns[i].AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center;
                gdgv.Columns[i].AppearanceHeader.TextOptions.VAlignment = VertAlignment.Center;
                gdgv.Columns[i].AppearanceCell.Options.UseTextOptions = true;
                gdgv.Columns[i].AppearanceCell.TextOptions.VAlignment = VertAlignment.Center;

                switch (i)
                {
                    case 2:
                    case 3:
                    case 6:
                    case 8:
                    case 7:
                    case 12:
                    case 13:
                    case 14:
                    case 15:
                    case 16:
                    case 17:
                    case 18:
                    case 19:
                    case 20:
                        gdgv.Columns[i].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Near;
                        break;
                    default:
                        gdgv.Columns[i].AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center;
                        break;
                }
            }

            gdgv.CustomRowCellEdit += Gdgv_customrowcelledit;
            gdgv.KeyUp += View_keyup;
            gdgv.CellValueChanged += View_cellvaluechanged;
        }
        private void Loadgv()
        {
            try
            {
                string fd = "id,fxh,fname,ftype,flen,fscale,fmemo,fzmc,srlx,byxm,hsxm,alignment,edit,formattype,formatstr," +
                    "masktype,maskstr,sumtype,sumfmt,search,tooltip";
                string sqlzd = string.Format("select " + fd + " from x9_sjzd where 1=0 AND zdbb='{0}' and tname='{1}' order by fxh", "", "");
                dtzd = KcDb.DtRead(sqlzd);
                if (dtzd != null)
                {
                    GridZD.ViewCollection.Clear();
                    gdgv.OptionsBehavior.AutoPopulateColumns = false;
                    GridZD.DataSource = dtzd;
                    gdgv = new GridView(GridZD);
                    gdgv.OptionsSelection.MultiSelect = true;
                    gdgv.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.RowSelect;
                    gdgv.OptionsView.EnableAppearanceEvenRow = true;
                    gdgv.OptionsView.EnableAppearanceOddRow = true;
                    GridZD.MainView = gdgv;
                    gdgv.PopulateColumns();
                    gdgv.PopupMenuShowing += Mtgv_popupmenushowing;
                    Gvft();
                }
                KcDb.DBclose();
            }
            catch (Exception ex)
            {
                MsgExShow("初始表格视图", ex.Message, ex.Source, ex.StackTrace);
            }
        }
        private void Loadric()
        {
            if (tzdbb == "kcrj")
            {
                //设计器
                ricombo1.Items.Clear();
                ricombo1.Items.Add("field");
                ricombo1.Items.Add("fieldlist");
                ricombo1.Items.Add("fieldlistex");
                ricombo1.Items.Add("textedit");
                ricombo1.Items.Add("texteditex");
                ricombo1.Items.Add("memoedit");
                ricombo2.Items.Clear();
                ricombo2.Items.Add("textedit");
                ricombo3.Items.Clear();
                ricombo3.Items.Add("textedit");
                ricombo4.Items.Clear();
                ricombo4.Items.Add("textedit");
                ricombo4.Items.Add("dateedit");
                ricombo5.Items.Clear();
                ricombo5.Items.Add("checkedit");
            }
            else
            {
                //用户功能          
                ricombo1.Items.Clear();
                ricombo1.Items.Add("textedit");
                ricombo1.Items.Add("textread");
                ricombo1.Items.Add("notenter");
                ricombo1.Items.Add("comboedit");
                ricombo1.Items.Add("listedit");
                ricombo1.Items.Add("buttonedit");
                ricombo1.Items.Add("buttonggxh");
                ricombo1.Items.Add("buttontextedit");
                ricombo1.Items.Add("buttontextread");
                ricombo1.Items.Add("checkedcomboedit");
                ricombo1.Items.Add("checkedlistedit");
                ricombo1.Items.Add("autonumber");
                ricombo1.Items.Add("memoedit");
                ricombo1.Items.Add("memoread");
                ricombo1.Items.Add("hyperlinkedit");
                ricombo1.Items.Add("fileedit");
                ricombo1.Items.Add("fileread");
                ricombo1.Items.Add("richtextedit");
                ricombo1.Items.Add("richtextread");

                ricombo2.Items.Clear();
                ricombo2.Items.Add("textedit");
                ricombo2.Items.Add("textread");
                ricombo2.Items.Add("notenter");
                ricombo2.Items.Add("autonumber");
                ricombo2.Items.Add("buttonedit");
                ricombo2.Items.Add("calcedit");
                ricombo2.Items.Add("coloredit");
                ricombo2.Items.Add("spinedit");

                ricombo3.Items.Clear();
                ricombo3.Items.Add("textedit");
                ricombo3.Items.Add("textread");
                ricombo3.Items.Add("notenter");
                ricombo3.Items.Add("calcedit");
                ricombo3.Items.Add("spinedit");

                ricombo4.Items.Clear();
                ricombo4.Items.Add("dateedit");
                ricombo4.Items.Add("textedit");
                ricombo4.Items.Add("textread");
                ricombo4.Items.Add("notenter");

                ricombo5.Items.Clear();
                ricombo5.Items.Add("checkedit");
                ricombo5.Items.Add("checkread");
            }

            ricombom.Items.Clear();
            ricombom.Items.Add("");
            ricombom.Items.Add("numeric");
            ricombom.Items.Add("datetime");
            ricombom.Items.Add("simple");
            ricombom.Items.Add("regular");
            ricombom.Items.Add("regex");
            ricombom.Items.Add("custom");

            ricombof.Items.Clear();
            ricombof.Items.Add("");
            ricombof.Items.Add("datetime");
            ricombof.Items.Add("numeric");
            ricombof.Items.Add("custom");

            ricombos.Items.Clear();
            ricombos.Items.Add("");
            ricombos.Items.Add("sum");
            ricombos.Items.Add("average");
            ricombos.Items.Add("count");
            ricombos.Items.Add("max");
            ricombos.Items.Add("min");

            ricombo1.TextEditStyle = TextEditStyles.DisableTextEditor;
            ricombo2.TextEditStyle = TextEditStyles.DisableTextEditor;
            ricombo3.TextEditStyle = TextEditStyles.DisableTextEditor;
            ricombo4.TextEditStyle = TextEditStyles.DisableTextEditor;
            ricombo5.TextEditStyle = TextEditStyles.DisableTextEditor;
            ricombom.TextEditStyle = TextEditStyles.DisableTextEditor;
            ricombof.TextEditStyle = TextEditStyles.DisableTextEditor;
            ricombos.TextEditStyle = TextEditStyles.DisableTextEditor;

            ricombo1.DropDownRows = 15;
            ricombo2.DropDownRows = 15;
            ricombo3.DropDownRows = 15;
            ricombo4.DropDownRows = 15;
            ricombo5.DropDownRows = 15;
            ricombom.DropDownRows = 15;
            ricombof.DropDownRows = 15;
            ricombos.DropDownRows = 10;

            GridZD.RepositoryItems.Clear();
            GridZD.RepositoryItems.Add(ricombo1);
            GridZD.RepositoryItems.Add(ricombo2);
            GridZD.RepositoryItems.Add(ricombo3);
            GridZD.RepositoryItems.Add(ricombo4);
            GridZD.RepositoryItems.Add(ricombo5);
            GridZD.RepositoryItems.Add(ricombom);
            GridZD.RepositoryItems.Add(ricombof);
            GridZD.RepositoryItems.Add(ricombos);
        }
        private void Makemodel(string str)
        {
            string mdstr = "";
            string tbname = ttbmc.Replace("_", "").ToLower();
            tbname = Dxkt(tbname);
            mdstr += "  //看潮企业管理软件 生成代码 岳国军 " + Environment.NewLine;
            mdstr += "  // " + Environment.NewLine;
            if (str == "")
            {
                mdstr += "  [table(\"" + ttbmc + "\")]" + Environment.NewLine;
            }
            mdstr += "  public class " + tbname + str + Environment.NewLine;
            mdstr += "  {" + Environment.NewLine;
            if (str == "")
            {
                mdstr += "    [key]" + Environment.NewLine;
            }
            for (int i = 0; i < dtzd.Rows.Count; i++)
            {
                DataRow row = dtzd.Rows[i];
                if (str == "dto" && !string.IsNullOrEmpty(tzdlb))
                {
                    if (tzdlb.IndexOf(row["fname"].ToString()) <= 1)
                    {
                        continue;
                    }
                }

                string ftype = row["ftype"].ToString().ToLower();
                string flen = row["flen"].ToString().Trim();
                string colname = row["fname"].ToString().ToLower();
                string coltype = "";  //注释类型
                string typestr = "";

                switch (ftype)
                {
                    case "bit":
                        typestr = "bool";
                        coltype = "typename = \"bit\"";
                        break;
                    case "smallint":
                        typestr = "sbyte";
                        coltype = "typename = \"smallint\"";
                        break;
                    case "bigint":
                    case "int":
                    case "tinyint":
                        typestr = "int";
                        coltype = "typename = \"int\"";
                        break;
                    case "numeric":
                    case "decimal":
                    case "money":
                    case "smallmoney":
                    case "float":
                    case "real":
                        typestr = "double";
                        coltype = "typename = \"decimal(16,2)\"";
                        break;
                    case "date":
                    case "datetime":
                    case "datetime2":
                        typestr = "DateTime";
                        coltype = "typename = \"datetime\")";
                        break;
                    case "char":
                    case "varchar":
                    case "text":
                        typestr = "string";
                        coltype = "typename = \"" + ftype + "(" + flen + ")" + "\"";
                        break;
                    case "nchar":
                    case "nvarchar":
                    case "ntext":
                        typestr = "string";
                        coltype = "typename = \"" + ftype + "\"";
                        coltype = "    [maxlength(" + flen + ")]";
                        break;
                }

                mdstr += "    /// <summary>" + Environment.NewLine;
                mdstr += "    ///" + row["fmemo"].ToString() + " " + row["edit"].ToString() + Environment.NewLine;
                mdstr += "    /// </summary>" + Environment.NewLine;

                if (!string.IsNullOrEmpty(coltype) && str == "")
                {
                    mdstr += "    [column(\"" + colname.ToLower() + "\"," + coltype + ")]" + Environment.NewLine;
                    if (Convert.ToBoolean(row["byxm"]))
                    {
                        mdstr += "    [required]" + Environment.NewLine;
                    }
                }
                mdstr += "    public " + typestr + " " + Dxkt(colname) + " { get; set; }" + Environment.NewLine;
            }
            mdstr += "}" + Environment.NewLine;
            Clipboard.SetText(mdstr);
        }
        private void Makepg()
        {
            string mdstr = "";
            string tbname = ttbmc.Replace("_", "").ToLower();
            string tbkey = "";
            tbname = Dxkt(tbname);
            mdstr += "--看潮企业管理软件 生成代码 岳国军 " + Environment.NewLine;
            mdstr += "--" + Environment.NewLine;
            mdstr += "-- drop table if exists public." + tbname + ";" + Environment.NewLine;
            mdstr += "create table if not exists public." + tbname + Environment.NewLine;
            mdstr += "(" + Environment.NewLine;
            for (int i = 0; i < dtzd.Rows.Count; i++)
            {
                DataRow row = dtzd.Rows[i];
                string ftype = row["ftype"].ToString().ToLower();
                string flen = row["flen"].ToString().Trim();
                string colname = row["fname"].ToString().ToLower();
                string typestr = "";
                switch (ftype)
                {
                    case "bit":
                        typestr = "boolean not null";
                        break;
                    case "smallint":
                        typestr = "smallint not null default 0";
                        break;
                    case "bigint":
                    case "int":
                    case "tinyint":
                        typestr = "integer not null default 0";
                        break;
                    case "numeric":
                    case "decimal":
                    case "money":
                    case "smallmoney":
                    case "float":
                    case "real":
                        typestr = "numeric(16,2) not null default 0";
                        break;
                    case "date":
                        typestr = "date";
                        break;
                    case "datetime":
                        typestr = "timestamp with time zone";
                        break;
                    case "time":
                        typestr = "time";
                        break;
                    case "char":
                    case "nchar":
                        typestr = "character(" + flen + ") collate pg_catalog.\"default\" not null default ''::bpchar";
                        break;
                    case "varchar":
                    case "nvarchar":
                        typestr = "character varying(" + flen + ") collate pg_catalog.\"default\" not null default ''::character varying";
                        break;
                    case "image":
                    case "varcinary":
                        typestr = "bytea";
                        break;
                    default:
                        break;
                }
                if (i == 0)
                {
                    tbkey = colname;
                }
                if (colname == "id" && ftype == "int")
                {
                    typestr = "integer not null default nextval('" + colname + "_serial_seq'::regclass)";
                }
                mdstr += "    " + colname + " " + typestr + "," + Environment.NewLine;
            }
            mdstr += "    constraint " + tbname + "_pkey primary key (" + tbkey + ")" + Environment.NewLine;
            mdstr += ")" + Environment.NewLine;
            mdstr += "tablespace pg_default;" + Environment.NewLine;
            mdstr += "alter table if exists public." + tbname + " owner to pghy;" + Environment.NewLine;
            Clipboard.SetText(mdstr);
        }
        private void Maketext()
        {
            string mdstr = "";
            string tbname = ttbmc.ToLower();
            mdstr += ttbmc + "字段列表:" + Environment.NewLine + Environment.NewLine;
            for (int i = 0; i < dtzd.Rows.Count; i++)
            {
                DataRow row = dtzd.Rows[i];
                mdstr += string.Format("{0,-8}", row["fname"]) + "\t";
                mdstr += string.Format("{0,-8}", row["ftype"]) + "\t";
                mdstr += string.Format("{0,5}", row["flen"]) + "\t";
                mdstr += string.Format("{0,-12}", row["fmemo"]) + "\t";
                mdstr += string.Format("{0,-8}", row["edit"]) + "\t";
                mdstr += string.Format("{0,8}", row["formatstr"]) + Environment.NewLine;
            }
            mdstr += Environment.NewLine;
            Clipboard.SetText(mdstr);
        }
        private void Mtgv_popupmenushowing(object sender, DevExpress.XtraGrid.Views.Grid.PopupMenuShowingEventArgs e)
        {
            try
            {
                if (e.Menu == null)
                {
                    return;
                }
                if (e.HitInfo.InColumnPanel)
                {
                    DXMenuItem dxmenu = new DXMenuItem();
                    dxmenu.Caption = "自动配置列宽";
                    dxmenu.Click += Dxmenuclick;
                    e.Menu.Items.Add(dxmenu);
                }
            }
            catch (Exception ex)
            {
                MsgExShow("增加配置列宽右键菜单", ex.Message, ex.Source, ex.StackTrace);
            }
        }
        private RepositoryItemComboBox Rc(string str)
        {
            switch (str)
            {
                case "文本":
                    return ricombo1;
                case "整型":
                    return ricombo2;
                case "数值":
                    return ricombo3;
                case "日期时间":
                    return ricombo4;
                case "逻辑":
                    return ricombo5;
                default:
                    return null;
            }
        }
        private RepositoryItemComboBox Rf(string str)
        {
            switch (str)
            {
                case "文本":
                case "整型":
                case "数值":
                case "日期时间":
                    return ricombof;
                default:
                    return null;
            }
        }
        private RepositoryItemComboBox Rm(string str)
        {
            switch (str)
            {
                case "文本":
                case "整型":
                case "数值":
                case "日期时间":
                    return ricombom;
                default:
                    return null;
            }
        }
        private RepositoryItemComboBox Rs(string str)
        {
            switch (str)
            {
                case "文本":
                case "整型":
                case "数值":
                case "日期时间":
                    return ricombos;
                default:
                    return null;
            }
        }
        private void SaveFmSet()
        {
            if (this.WindowState != FormWindowState.Normal)
            {
                return;
            }
            try
            {
                string fmset;
                fmset = this.Top.ToString() + "," + this.Left.ToString() + "," + this.Width.ToString() + "," + this.Height.ToString() + "," +
                Sp1.SplitterPosition.ToString() + "," + (gdgv == null ? "25" : gdgv.RowHeight.ToString());
                if (this.WindowState == FormWindowState.Normal) FmSave(this.Text, fmset);
                if (gdgv != null)
                {
                    if (gdgv.RowCount > 0)
                    {
                        fmset = gdgv.Columns[0].Width.ToString().Trim();
                        for (int g = 1; g < gdgv.Columns.Count; g++)
                        {
                            fmset = fmset + "," + gdgv.Columns[g].Width.ToString().Trim();
                        }
                        FmSave(this.Text + "表格", fmset);
                    }
                }
            }
            catch (Exception ex)
            {
                MsgExShow("保存窗口参数", ex.Message, ex.Source, ex.StackTrace);
            }
        }
        private void Setgv(ref GridView gv, bool bj)
        {
            gv.RowHeight = 30;
            gv.ColumnPanelRowHeight = PanelRowHeight;
            gv.Appearance.HeaderPanel.TextOptions.VAlignment = VertAlignment.Center;
            gv.Appearance.HeaderPanel.TextOptions.HAlignment = HorzAlignment.Center;
            gv.Appearance.HeaderPanel.TextOptions.WordWrap = WordWrap.Wrap;
            gv.IndicatorWidth = 20;
            gv.OptionsCustomization.AllowRowSizing = true;
            gv.OptionsView.ShowGroupPanel = false;
            gv.OptionsView.ShowGroupedColumns = false;
            gv.OptionsView.ColumnAutoWidth = false;
            gv.OptionsView.NewItemRowPosition = NewItemRowPosition.None;
            gv.OptionsView.ShowFooter = false;
            gv.OptionsBehavior.ReadOnly = !bj;
        }
        private void View_cellvaluechanged(object sender, CellValueChangedEventArgs e)
        {
            if (!sfzr) return;
            if (sftj)
            {
                sftj = false;
                BarTJ.Enabled = true;
            }
        }
        private void View_keyup(object sender, KeyEventArgs e)
        {
            //回车后移至下一单元格
            if (e.KeyCode == Keys.Enter)
            {
                SendKeys.Send("{down}");
                SendKeys.Send("{enter}");
            }
        }
    }
}

二、设计器代码说明

窗体设计器代码文件说明:FmSjzd.Designer.cs

(一)文件概述

文件位置: KcErp 项目
窗体名称: FmSjzd(数据字典管理窗体)
文件类型: Windows Forms 设计器自动生成的代码文件(不应手动修改)

(二)主要控件结构

1. 顶部功能区

  • RibbonControl: DevExpress 功能区控件
    • RibbonPage1: 主功能页签
      • RibbonPageGroup1: 数据操作组(载入、提交)
      • RibbonPageGroup2: 打印功能组
      • RibbonPageGroup3: 帮助与操作组(列赋值、列清空、帮助、返回)

2. 状态栏

  • RibbonStatusBar: 底部状态栏,包含 L1 状态标签

3. 主界面布局

  • Sp1: 垂直分割容器,分为上下两部分
    • Panel1(上部控制区): 高度50px,包含筛选和操作按钮
    • Panel2(下部数据显示区): 剩余空间,显示 GridZD 网格

4. 控制区组件(Panel1)

  • 左侧部分:
    • Lzdzl: 字典种类标签
    • LabelControl2: 数据表名标签
    • CBE2: 表名下拉选择框
  • 中部部分:
    • Lgnmc: 字典版本标签
    • TextBB: 版本号文本框(只读)
  • 右侧按钮(从右到左):
    • ButtonpPG: 生成PG语句(用于迁移)
    • ButtonWB: 生成列表文本(用于保存到文本)
    • ButtonCZ: 重置字段列表
    • ButtonRF: 刷新字段列表

5. 数据显示区(Panel2)

  • GridZD: 数据网格控件
    • GridView1: 默认网格视图
    • CardView1: 卡片视图

(三)功能区按钮说明

数据操作组:

  • BarZR: 载入数据
  • BarTJ: 提交修改

打印功能组:

  • BarDY: 打印功能

帮助与操作组:

  • BarF2: 列赋值(快捷键 Ctrl+F2)
  • BarDEL: 列清空(快捷键 Ctrl+Delete)
  • BarHELP: 帮助文档
  • BarEXIT: 返回/退出

(四)界面特性

  1. 尺寸: 窗体大小 1550×599 像素
  2. 布局: 功能区(128px)+ 分割容器(444px)+ 状态栏(27px)
  3. 字体: 使用“微软雅黑”12号字体
  4. 定位: 屏幕居中显示
  5. 工具栏: 隐藏快速访问工具栏
  6. 背景工作器: BackgroundWorker1 支持取消操作

(五)控件分组说明

控件前缀 类型 用途
Bar Ribbon按钮 功能区操作按钮
Ribbon 功能区组件 顶部菜单和工具
Button 按钮 窗体操作按钮
L LabelControl 标签说明
Text TextEdit 文本输入框
CBE ComboBoxEdit 下拉选择框
Grid GridControl 数据网格
Sp SplitContainerControl 分割容器

(六)注意事项

  1. 设计器代码: 此文件为 Visual Studio 设计器自动生成,手动修改可能导致设计器异常
  2. 资源释放: Dispose 方法确保控件资源正确释放
  3. 初始化顺序: InitializeComponent 方法按控件依赖关系顺序初始化
  4. 事件处理: 所有按钮事件处理应在对应的 .cs 代码文件中实现
  5. 多视图支持: GridZD 支持网格视图和卡片视图两种显示模式

(七)相关文件

  • FmSjzd.cs: 窗体逻辑代码文件
  • FmSjzd.resx: 窗体资源文件(如果存在)

提示: 如需修改界面布局,请在 Visual Studio 设计器中进行操作,避免直接修改此文件。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐