LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# WinForms 多窗口的使用示例

admin
2025年10月19日 2:7 本文热度 153

测试用例 WinForms 多窗口应用示例,包含主窗口、子窗口、模态窗口和非模态窗口的创建和管理。

1. 项目结构和基础类

项目文件结构

MultiWindowApp/
├── Forms/
│   ├── MainForm.cs
│   ├── ChildForm.cs
│   ├── ModalDialogForm.cs
│   └── SettingsForm.cs
├── Models/
│   └── UserData.cs
└── Program.cs

窗口是空白窗口



数据模型类

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace MultiWindowApp.Models{    // 用户数据模型    public class UserData    {        public string Name { getset; }        public int Age { getset; }        public string Email { getset; }        public DateTime CreatedAt { getset; } = DateTime.Now;        public override string ToString()        {            return $"{Name} (Age: {Age}, Email: {Email})";        }    }    // 应用设置    public class AppSettings    {        public string Theme { getset; } = "Light";        public bool AutoSave { getset; } = true;        public int MaxRecentFiles { getset; } = 5;        public string Language { getset; } = "Chinese";    }}


2. 子窗口实现

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace MultiWindowApp.Forms{    public partial class ChildForm : Form    {        private MainForm mainForm;        private TextBox textBoxContent;        private Button btnSendToMain;        private Button btnClose;        public string Content => textBoxContent.Text;        //public ChildForm()        //{        //    InitializeComponent();        //}        public ChildForm(string title, MainForm mainForm)        {            this.mainForm = mainForm;            this.Text = title;            InitializeComponent();            InitFormComponent();        }        private void InitFormComponent()        {            this.Size = new Size(400300);            this.StartPosition = FormStartPosition.CenterParent;            this.FormBorderStyle = FormBorderStyle.SizableToolWindow;            // 创建内容文本框            textBoxContent = new TextBox();            textBoxContent.Multiline = true;            textBoxContent.Dock = DockStyle.Fill;            textBoxContent.ScrollBars = ScrollBars.Vertical;            textBoxContent.Text = $"这是 {this.Text} 的内容区域。\r\n您可以在这里输入文本...";            // 创建按钮面板            Panel buttonPanel = new Panel();            buttonPanel.Dock = DockStyle.Bottom;            buttonPanel.Height = 40;            buttonPanel.Padding = new Padding(5);            // 发送到主窗口按钮            btnSendToMain = new Button();            btnSendToMain.Text = "发送到主窗口";            btnSendToMain.Dock = DockStyle.Right;            btnSendToMain.Width = 100;            btnSendToMain.Click += BtnSendToMain_Click;            // 关闭按钮            btnClose = new Button();            btnClose.Text = "关闭";            btnClose.Dock = DockStyle.Right;            btnClose.Width = 80;            btnClose.Margin = new Padding(5000);            btnClose.Click += (s, e) => this.Close();            buttonPanel.Controls.Add(btnClose);            buttonPanel.Controls.Add(btnSendToMain);            this.Controls.Add(textBoxContent);            this.Controls.Add(buttonPanel);        }        private void BtnSendToMain_Click(object sender, EventArgs e)        {            if (mainForm != null)            {                // 这里可以通过事件、方法调用等方式与主窗口通信                MessageBox.Show($"已向主窗口发送消息: {textBoxContent.Text}",                              "子窗口消息", MessageBoxButtons.OK, MessageBoxIcon.Information);            }        }        // 窗口激活事件        protected override void OnActivated(EventArgs e)        {            this.Opacity = 1.0;            base.OnActivated(e);        }        // 窗口停用事件        protected override void OnDeactivate(EventArgs e)        {            this.Opacity = 0.8;            base.OnDeactivate(e);        }    }}


3. 模态对话框实现

using MultiWindowApp.Models;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace MultiWindowApp.Forms{    public partial class ModalDialogForm : Form    {        private TextBox txtName;        private NumericUpDown numAge;        private TextBox txtEmail;        private Button btnOK;        private Button btnCancel;        public UserData UserData { get; private set; }        public ModalDialogForm()        {            InitializeComponent();            InitFormComponent();            UserData = new UserData();        }        private void InitFormComponent()        {            this.Size = new Size(350200);            this.StartPosition = FormStartPosition.CenterParent;            this.FormBorderStyle = FormBorderStyle.FixedDialog;            this.MaximizeBox = false;            this.MinimizeBox = false;            this.Text = "用户信息对话框";            // 创建表格布局            TableLayoutPanel tableLayout = new TableLayoutPanel();            tableLayout.Dock = DockStyle.Fill;            tableLayout.Padding = new Padding(10);            tableLayout.RowCount = 4;            tableLayout.ColumnCount = 2;            // 设置行高            tableLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));            tableLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));            tableLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));            tableLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));            // 设置列宽            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 80F));            tableLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));            // 姓名标签和文本框            Label lblName = new Label { Text = "姓名:", TextAlign = ContentAlignment.MiddleRight };            txtName = new TextBox { Dock = DockStyle.Fill };            // 年龄标签和数字选择框            Label lblAge = new Label { Text = "年龄:", TextAlign = ContentAlignment.MiddleRight };            numAge = new NumericUpDown            {                Dock = DockStyle.Fill,                Minimum = 1,                Maximum = 120,                Value = 25            };            // 邮箱标签和文本框            Label lblEmail = new Label { Text = "邮箱:", TextAlign = ContentAlignment.MiddleRight };            txtEmail = new TextBox { Dock = DockStyle.Fill };            txtEmail.Text = "example@domain.com";            // 按钮面板            Panel buttonPanel = new Panel { Dock = DockStyle.Fill };            buttonPanel.Controls.Add(CreateButtonPanel());            // 添加到表格            tableLayout.Controls.Add(lblName, 00);            tableLayout.Controls.Add(txtName, 10);            tableLayout.Controls.Add(lblAge, 01);            tableLayout.Controls.Add(numAge, 11);            tableLayout.Controls.Add(lblEmail, 02);            tableLayout.Controls.Add(txtEmail, 12);            tableLayout.Controls.Add(buttonPanel, 03);            tableLayout.SetColumnSpan(buttonPanel, 2);            this.Controls.Add(tableLayout);        }        private Panel CreateButtonPanel()        {            Panel panel = new Panel();            panel.Height = 30;            panel.Dock = DockStyle.Bottom;            btnOK = new Button            {                Text = "确定",                DialogResult = DialogResult.OK,                Size = new Size(7525),                Location = new Point(1250)            };            btnOK.Click += BtnOK_Click;            btnCancel = new Button            {                Text = "取消",                DialogResult = DialogResult.Cancel,                Size = new Size(7525),                Location = new Point(2050)            };            // 设置确定按钮为接受按钮            this.AcceptButton = btnOK;            // 设置取消按钮为取消按钮            this.CancelButton = btnCancel;            panel.Controls.Add(btnOK);            panel.Controls.Add(btnCancel);            return panel;        }        private void BtnOK_Click(object sender, EventArgs e)        {            // 验证输入            if (string.IsNullOrWhiteSpace(txtName.Text))            {                MessageBox.Show("请输入姓名""输入错误",                              MessageBoxButtons.OK, MessageBoxIcon.Warning);                txtName.Focus();                return;            }            if (string.IsNullOrWhiteSpace(txtEmail.Text) || !txtEmail.Text.Contains("@"))            {                MessageBox.Show("请输入有效的邮箱地址""输入错误",                              MessageBoxButtons.OK, MessageBoxIcon.Warning);                txtEmail.Focus();                return;            }            // 保存数据            UserData.Name = txtName.Text.Trim();            UserData.Age = (int)numAge.Value;            UserData.Email = txtEmail.Text.Trim();        }    }}


4. 设置窗口实现

using MultiWindowApp.Models;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace MultiWindowApp.Forms{    public partial class SettingsForm : Form    {        private AppSettings currentSettings;        private ComboBox comboTheme;        private CheckBox checkAutoSave;        private NumericUpDown numMaxRecentFiles;        private ComboBox comboLanguage;        private Button btnSave;        private Button btnCancel;        // 定义设置更改事件        public event Action<AppSettings> SettingsChanged;        public SettingsForm(AppSettings settings)        {            currentSettings = settings;            InitializeComponent();            InitFormComponent();            LoadSettings();        }        //public SettingsForm()        //{        //    InitializeComponent();        //}        private void InitFormComponent()        {            this.Size = new Size(400300);            this.StartPosition = FormStartPosition.CenterParent;            this.FormBorderStyle = FormBorderStyle.FixedDialog;            this.MaximizeBox = false;            this.MinimizeBox = false;            this.Text = "应用设置";            CreateControls();        }        private void CreateControls()        {            TableLayoutPanel mainTable = new TableLayoutPanel();            mainTable.Dock = DockStyle.Fill;            mainTable.Padding = new Padding(15);            mainTable.RowCount = 5;            mainTable.ColumnCount = 2;            // 主题设置            Label lblTheme = new Label { Text = "主题:", TextAlign = ContentAlignment.MiddleRight, Dock = DockStyle.Fill };            comboTheme = new ComboBox { Dock = DockStyle.Fill, DropDownStyle = ComboBoxStyle.DropDownList };            comboTheme.Items.AddRange(new object[] { "Light""Dark""Blue""Green" });            // 自动保存            Label lblAutoSave = new Label { Text = "自动保存:", TextAlign = ContentAlignment.MiddleRight, Dock = DockStyle.Fill };            checkAutoSave = new CheckBox { Text = "启用自动保存", Dock = DockStyle.Fill };            // 最近文件数量            Label lblMaxFiles = new Label { Text = "最近文件数量:", TextAlign = ContentAlignment.MiddleRight, Dock = DockStyle.Fill };            numMaxRecentFiles = new NumericUpDown            {                Dock = DockStyle.Fill,                Minimum = 1,                Maximum = 20,                Value = 5            };            // 语言设置            Label lblLanguage = new Label { Text = "语言:", TextAlign = ContentAlignment.MiddleRight, Dock = DockStyle.Fill };            comboLanguage = new ComboBox { Dock = DockStyle.Fill, DropDownStyle = ComboBoxStyle.DropDownList };            comboLanguage.Items.AddRange(new object[] { "Chinese""English""Japanese""Spanish" });            // 按钮面板            Panel buttonPanel = new Panel { Dock = DockStyle.Fill, Height = 40 };            btnSave = new Button { Text = "保存", Size = new Size(8030), Location = new Point(1505) };            btnCancel = new Button { Text = "取消", Size = new Size(8030), Location = new Point(2355) };            btnSave.Click += BtnSave_Click;            btnCancel.Click += (s, e) => this.Close();            buttonPanel.Controls.Add(btnSave);            buttonPanel.Controls.Add(btnCancel);            // 添加到主表格            mainTable.Controls.Add(lblTheme, 00);            mainTable.Controls.Add(comboTheme, 10);            mainTable.Controls.Add(lblAutoSave, 01);            mainTable.Controls.Add(checkAutoSave, 11);            mainTable.Controls.Add(lblMaxFiles, 02);            mainTable.Controls.Add(numMaxRecentFiles, 12);            mainTable.Controls.Add(lblLanguage, 03);            mainTable.Controls.Add(comboLanguage, 13);            mainTable.Controls.Add(buttonPanel, 04);            mainTable.SetColumnSpan(buttonPanel, 2);            // 设置行和列样式            for (int i = 0; i < 4; i++)            {                mainTable.RowStyles.Add(new RowStyle(SizeType.Percent, 20F));            }            mainTable.RowStyles.Add(new RowStyle(SizeType.Percent, 20F));            mainTable.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 120F));            mainTable.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));            this.Controls.Add(mainTable);        }        private void LoadSettings()        {            comboTheme.SelectedItem = currentSettings.Theme;            checkAutoSave.Checked = currentSettings.AutoSave;            numMaxRecentFiles.Value = currentSettings.MaxRecentFiles;            comboLanguage.SelectedItem = currentSettings.Language;        }        private void BtnSave_Click(object sender, EventArgs e)        {            AppSettings newSettings = new AppSettings            {                Theme = comboTheme.SelectedItem?.ToString() ?? "Light",                AutoSave = checkAutoSave.Checked,                MaxRecentFiles = (int)numMaxRecentFiles.Value,                Language = comboLanguage.SelectedItem?.ToString() ?? "Chinese"            };            // 触发设置更改事件            SettingsChanged?.Invoke(newSettings);            this.DialogResult = DialogResult.OK;            this.Close();        }    }}


5. 主窗口实现

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using MultiWindowApp.Forms;using MultiWindowApp.Models;namespace MultiWindowApp{    public partial class MainForm : Form    {        private List<Form> openChildForms = new List<Form>();        private List<UserData> userList = new List<UserData>();        private AppSettings settings = new AppSettings();        // UI 控件        private MenuStrip mainMenu;        private ToolStrip toolStrip;        private StatusStrip statusStrip;        private Panel contentPanel;        private ListBox listBoxUsers;        public MainForm()        {            InitializeComponent();            InitMainForm();            UpdateStatus("应用程序已启动");        }        private void InitMainForm()        {            // 主窗体设置            this.Text = "多窗口应用示例 - 主窗口";            this.Size = new Size(800600);            this.StartPosition = FormStartPosition.CenterScreen;            this.WindowState = FormWindowState.Maximized;            //// 创建菜单            //CreateMainMenu();            // 创建工具栏            CreateToolStrip();            // 创建状态栏            CreateStatusStrip();            // 创建内容区域            CreateContentArea();        }        private void CreateMainMenu()        {            mainMenu = new MenuStrip();            // 文件菜单            ToolStripMenuItem fileMenu = new ToolStripMenuItem("文件(&F)");            fileMenu.DropDownItems.Add("新建(&N)"null, (s, e) => CreateNewUser());            fileMenu.DropDownItems.Add("打开(&O)"null, (s, e) => OpenUserData());            fileMenu.DropDownItems.Add("-"); // 分隔符            fileMenu.DropDownItems.Add("退出(&X)"null, (s, e) => Application.Exit());            // 窗口菜单            ToolStripMenuItem windowMenu = new ToolStripMenuItem("窗口(&W)");            windowMenu.DropDownItems.Add("新建子窗口(&N)"null, (s, e) => OpenChildForm());            windowMenu.DropDownItems.Add("模态对话框(&M)"null, (s, e) => OpenModalDialog());            windowMenu.DropDownItems.Add("-");            windowMenu.DropDownItems.Add("层叠(&C)"null, (s, e) => LayoutMdi(MdiLayout.Cascade));            windowMenu.DropDownItems.Add("水平平铺(&H)"null, (s, e) => LayoutMdi(MdiLayout.TileHorizontal));            windowMenu.DropDownItems.Add("垂直平铺(&V)"null, (s, e) => LayoutMdi(MdiLayout.TileVertical));            windowMenu.DropDownItems.Add("排列图标(&A)"null, (s, e) => LayoutMdi(MdiLayout.ArrangeIcons));            // 设置菜单            ToolStripMenuItem settingsMenu = new ToolStripMenuItem("设置(&S)");            settingsMenu.DropDownItems.Add("应用设置(&A)"null, (s, e) => OpenSettingsForm());            mainMenu.Items.AddRange(new ToolStripMenuItem[] { fileMenu, windowMenu, settingsMenu });            this.MainMenuStrip = mainMenu;            this.Controls.Add(mainMenu);        }        private void CreateToolStrip()        {            toolStrip = new ToolStrip();            // 添加工具按钮            ToolStripButton newUserBtn = new ToolStripButton("新建用户"null, (s, e) => CreateNewUser());            ToolStripButton childFormBtn = new ToolStripButton("子窗口"null, (s, e) => OpenChildForm());            ToolStripButton modalBtn = new ToolStripButton("模态对话框"null, (s, e) => OpenModalDialog());            ToolStripButton settingsBtn = new ToolStripButton("设置"null, (s, e) => OpenSettingsForm());            toolStrip.Items.AddRange(new ToolStripItem[] {                newUserBtn, childFormBtn, modalBtn,                new ToolStripSeparator(), settingsBtn            });            this.Controls.Add(toolStrip);        }        private void CreateStatusStrip()        {            statusStrip = new StatusStrip();            ToolStripStatusLabel statusLabel = new ToolStripStatusLabel("就绪");            statusLabel.Spring = true;            statusLabel.TextAlign = ContentAlignment.MiddleLeft;            ToolStripStatusLabel timeLabel = new ToolStripStatusLabel();            timeLabel.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");            // 更新时间            Timer timer = new Timer();            timer.Interval = 1000;            timer.Tick += (s, e) => timeLabel.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");            timer.Start();            statusStrip.Items.AddRange(new ToolStripItem[] { statusLabel, timeLabel });            this.Controls.Add(statusStrip);        }        private void CreateContentArea()        {            contentPanel = new Panel();            contentPanel.Dock = DockStyle.Fill;            contentPanel.BackColor = SystemColors.Window;            // 创建用户列表            listBoxUsers = new ListBox();            listBoxUsers.Dock = DockStyle.Left;            listBoxUsers.Width = 250;            listBoxUsers.SelectedIndexChanged += ListBoxUsers_SelectedIndexChanged;            // 添加一些示例数据            userList.Add(new UserData { Name = "张三", Age = 25, Email = "zhangsan@example.com" });            userList.Add(new UserData { Name = "李四", Age = 30, Email = "lisi@example.com" });            userList.Add(new UserData { Name = "王五", Age = 28, Email = "wangwu@example.com" });            RefreshUserList();            contentPanel.Controls.Add(listBoxUsers);            this.Controls.Add(contentPanel);        }        private void RefreshUserList()        {            listBoxUsers.Items.Clear();            foreach (var user in userList)            {                listBoxUsers.Items.Add(user);            }        }        private void ListBoxUsers_SelectedIndexChanged(object sender, EventArgs e)        {            if (listBoxUsers.SelectedItem is UserData selectedUser)            {                UpdateStatus($"选中用户: {selectedUser.Name}");            }        }        private void UpdateStatus(string message)        {            if (statusStrip.Items.Count > 0)            {                statusStrip.Items[0].Text = message;            }        }        // 创建新用户        private void CreateNewUser()        {            using (var form = new ModalDialogForm())            {                if (form.ShowDialog() == DialogResult.OK)                {                    userList.Add(form.UserData);                    RefreshUserList();                    UpdateStatus($"已创建用户: {form.UserData.Name}");                }            }        }        // 打开用户数据        private void OpenUserData()        {            OpenFileDialog dialog = new OpenFileDialog();            dialog.Filter = "文本文件|*.txt|所有文件|*.*";            if (dialog.ShowDialog() == DialogResult.OK)            {                // 这里可以添加实际的文件读取逻辑                UpdateStatus($"已打开文件: {dialog.FileName}");            }        }        // 打开子窗口        private void OpenChildForm()        {            ChildForm childForm = new ChildForm($"子窗口 {openChildForms.Count + 1}"this);            childForm.FormClosed += (s, e) => openChildForms.Remove((Form)s);            childForm.Show();            openChildForms.Add(childForm);            UpdateStatus($"已打开子窗口: {childForm.Text}");        }        // 打开模态对话框        private void OpenModalDialog()        {            using (var form = new ModalDialogForm())            {                if (form.ShowDialog() == DialogResult.OK)                {                    MessageBox.Show($"用户数据: {form.UserData}""模态对话框结果",                                  MessageBoxButtons.OK, MessageBoxIcon.Information);                }            }        }        // 打开设置窗口        private void OpenSettingsForm()        {            SettingsForm settingsForm = new SettingsForm(settings);            settingsForm.SettingsChanged += (newSettings) =>            {                settings = newSettings;                UpdateStatus($"设置已更新 - 主题: {settings.Theme}, 语言: {settings.Language}");                ApplySettings(settings);            };            settingsForm.ShowDialog();        }        // 应用设置        private void ApplySettings(AppSettings newSettings)        {            // 这里可以根据设置更改应用外观            if (newSettings.Theme == "Dark")            {                this.BackColor = Color.FromArgb(323232);                this.ForeColor = Color.White;            }            else            {                this.BackColor = SystemColors.Control;                this.ForeColor = SystemColors.ControlText;            }        }        // 主窗体关闭事件        protected override void OnFormClosing(FormClosingEventArgs e)        {            if (openChildForms.Count > 0)            {                DialogResult result = MessageBox.Show(                    "还有子窗口未关闭,确定要退出吗?",                    "确认退出",                    MessageBoxButtons.YesNo,                    MessageBoxIcon.Question);                if (result == DialogResult.No)                {                    e.Cancel = true;                    return;                }            }            base.OnFormClosing(e);        }    }}


6. 程序入口

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace MultiWindowApp{    static class Program    {        /// <summary>        /// 应用程序的主入口点。        /// </summary>        [STAThread]        static void Main()        {            Application.EnableVisualStyles();            Application.SetCompatibleTextRenderingDefault(false);            // 显示启动画面(可选)            ShowSplashScreen();            Application.Run(new MainForm());        }        static void ShowSplashScreen()        {            Form splash = new Form();            splash.Size = new System.Drawing.Size(300200);            splash.StartPosition = FormStartPosition.CenterScreen;            splash.FormBorderStyle = FormBorderStyle.FixedSingle;// None;            splash.BackColor = System.Drawing.Color.LightBlue;            splash.Text = "多窗口应用,启动中...";            //Label label = new Label();            //label.Text = "多窗口应用,启动中...";            //label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;            //label.Dock = DockStyle.Top;// Fill;            //label.Font = new System.Drawing.Font("Microsoft C#", 16F);            //splash.Controls.Add(label);            splash.Show();            // 显示10秒            System.Threading.Thread.Sleep(10000);            splash.Close();        }    }}


7. 测试


8. 说明

窗口类型和用途

  1. 主窗口 (MainForm)

    • 应用的主界面
    • 管理其他窗口的生命周期
    • 提供菜单、工具栏和状态栏
  2. 子窗口 (ChildForm)

    • 非模态窗口
    • 可以与主窗口同时操作
    • 可以传递数据给主窗口
  3. 模态对话框 (ModalDialogForm)

    • 阻塞父窗口输入
    • 用于获取用户输入
    • 通过 ShowDialog() 显示
  4. 设置窗口 (SettingsForm)

    • 使用事件传递设置更改
    • 演示数据绑定和验证

窗口间通信方式

  1. 构造函数传参

    ChildForm childForm =newChildForm("标题",this);
  2. 公共属性和方法

    publicstring Content => textBoxContent.Text;
  3. 事件机制

    publiceventAction<AppSettings> SettingsChanged;
    SettingsChanged?.Invoke(newSettings);
  4. DialogResult

    if(form.ShowDialog()== DialogResult.OK)
    {
    // 处理结果
    }

实践

  1. 资源管理

    • 使用 using 语句确保模态对话框正确释放
    • 在窗体关闭时清理资源
  2. 线程安全

    • 所有UI操作都在UI线程执行
    • 使用 InvokeRequired 检查
  3. 用户体验

    • 提供适当的反馈(状态栏、消息框)
    • 合理的默认值和输入验证
    • 一致的界面布局
  4. 可维护性

    • 分离关注点(模型、视图)
    • 使用有意义的名字和注释
    • 遵循一致的编码规范


阅读原文:原文链接


该文章在 2025/10/20 10:29:05 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved