(二十七)c#Winform自定义控件-多输入窗体

前提

入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

官网:https://www.hzhcontrols.cn

GitHub:https://github.com/kwwwvagaa/NetWinformControl

码云:HZHControls控件库: HZHControls控件库,c#的winform自定义控件,对触屏具有更好的操作支持,项目是基于framework4.0,完全原生控件开发,没有使用任何第三方控件,你可以放心的用在你的项目中(winfromcontrol/winformcontrol/.net)。还有更丰富的工业控件持续增加中~~~

如果觉得写的还行,请点个 star 支持一下吧

欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

目录

c#Winform自定义控件-目录_c#winform自定义控件-有图标的按钮-CSDN博客

准备工作

这个窗体继承子基类窗体FrmWithOKCancel1,如果你对FrmWithOKCancel1还不了解,请移步 (二十五)c#Winform自定义控件-有确定取消的窗体(一) 查看

开始

添加一个Form,命名FrmInputs,继承FrmWithOKCancel1

一个多参构造函数

复制代码

  1  #region 构造函数
  2         /// <summary>
  3         /// 功能描述:构造函数
  4         /// 作  者:HZH
  5         /// 创建日期:2019-08-05 10:57:26
  6         /// 任务编号:POS
  7         /// </summary>
  8         /// <param name="strTitle">窗体标题</param>
  9         /// <param name="args">输入项名称</param>
 10         /// <param name="inTypes">输入项对应输入类型,key:输入项名称,如不设置默认不控制输入</param>
 11         /// <param name="regexs">输入项对应正则规则,当imTypes=Regex时有效,key:输入项名称,如不设置默认不控制输入</param>
 12         /// <param name="keyBoards">文本框键盘,key:输入项名称,如不设置默认英文键盘</param>
 13         /// <param name="mastInputs">必填输入项名称</param>
 14         /// <param name="defaultValues">输入项默认值,key:输入项名称</param>
 15         public FrmInputs(
 16             string strTitle,
 17             string[] inPutLabels,
 18             Dictionary<string, TextInputType> inTypes = null,
 19             Dictionary<string, string> regexs = null,
 20             Dictionary<string, HZH_Controls.Controls.KeyBoardType> keyBoards = null,
 21             List<string> mastInputs = null,
 22             Dictionary<string, string> defaultValues = null)
 23         {
 24             InitializeComponent();
 25             this.Title = strTitle;
 26             if (inPutLabels.Length <= 0)
 27             {
 28                 throw new Exception("输入数量不能为空");
 29             }
 30             try
 31             {
 32                 Values = new string[inPutLabels.Length];
 33                 HZH_Controls.ControlHelper.FreezeControl(this, true);
 34 
 35                 for (int i = inPutLabels.Length - 1; i >= 0; i--)
 36                 {
 37                     Panel p = new Panel();
 38                     p.Dock = DockStyle.Top;
 39                     p.Height = 62;
 40                     p.Padding = new Padding(10);
 41 
 42                     HZH_Controls.Controls.UCTextBoxEx txt = new Controls.UCTextBoxEx();
 43                     txt.Dock = DockStyle.Fill;
 44                     txt.IsShowKeyboard = true;
 45                     txt.IsShowClearBtn = true;
 46                     txt.Name = "txt_" + i;
 47                     txt.TabIndex = i;
 48                     if (inTypes != null && inTypes.ContainsKey(inPutLabels[i]))
 49                     {
 50                         txt.InputType = inTypes[inPutLabels[i]];
 51                         if (txt.InputType == TextInputType.Regex && regexs != null && regexs.ContainsKey(inPutLabels[i]))
 52                             txt.RegexPattern = regexs[inPutLabels[i]];
 53                     }
 54                     if (keyBoards != null && keyBoards.ContainsKey(inPutLabels[i]))
 55                         txt.KeyBoardType = keyBoards[inPutLabels[i]];
 56                     if (mastInputs != null && mastInputs.Contains(inPutLabels[i]))
 57                     {
 58                         m_mastInputs[i] = inPutLabels[i];
 59                     }
 60                     if (defaultValues != null && defaultValues.ContainsKey(inPutLabels[i]))
 61                         txt.InputText = defaultValues[inPutLabels[i]];
 62                     p.Controls.Add(txt);
 63 
 64                     Label lbl = new Label();
 65                     lbl.Text = inPutLabels[i];
 66                     lbl.Padding = new System.Windows.Forms.Padding(0, 0, 5, 0);
 67                     lbl.TextAlign = ContentAlignment.MiddleRight;
 68                     lbl.AutoSize = false;
 69                     lbl.Width = 120;
 70                     lbl.Dock = DockStyle.Left;
 71                     lbl.Font = new System.Drawing.Font("微软雅黑", 12);
 72                     p.Controls.Add(lbl);
 73 
 74                     Label lblT = new Label();
 75                     if (mastInputs != null && mastInputs.Contains(inPutLabels[i]))
 76                     {
 77                         lblT.Text = "*";
 78                     }
 79                     else
 80                     {
 81                         lblT.Text = "";
 82                     }
 83                     lblT.AutoSize = false;
 84                     lblT.TextAlign = ContentAlignment.MiddleLeft;
 85                     lblT.Width = 25;
 86                     lblT.Dock = DockStyle.Right;
 87                     lblT.Font = new System.Drawing.Font("微软雅黑", 12);
 88                     lblT.ForeColor = Color.Red;
 89                     p.Controls.Add(lblT);
 90                     this.panel3.Controls.Add(p);
 91                     this.ActiveControl = txt;
 92                 }
 93 
 94                 this.Height = 124 + inPutLabels.Length * 62;
 95             }
 96             finally
 97             {
 98                 HZH_Controls.ControlHelper.FreezeControl(this, false);
 99             }
100         }
101         #endregion

复制代码

重写DoEnter函数

复制代码

 1 protected override void DoEnter()
 2         {
 3             for (int i = 0; i < Values.Length; i++)
 4             {
 5                 var cs = this.panel3.Controls.Find("txt_" + i, true);
 6                 if (cs.Length > 0)
 7                 {
 8                     var txt = cs[0] as HZH_Controls.Controls.UCTextBoxEx;
 9                     Values[i] = txt.InputText;
10                     if (m_mastInputs.ContainsKey(i) && string.IsNullOrWhiteSpace(txt.InputText))
11                     {
12                         HZH_Controls.Forms.FrmTips.ShowTipsInfo(this, "[" + m_mastInputs[i] + "]必须输入。");
13                         return;
14                     }
15                 }
16             }
17             base.DoEnter();
18         }

复制代码

完整代码如下

// 版权所有  黄正辉  交流群:568015492   QQ:623128629
// 文件名称:FrmInputs.cs
// 创建日期:2019-08-15 16:04:41
// 功能描述:FrmInputs
// 项目地址:https://gitee.com/kwwwvagaa/net_winform_custom_control
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace HZH_Controls.Forms
{
    public partial class FrmInputs : FrmWithOKCancel1
    {
        public string[] Values { get; private set; }
        private Dictionary<int, string> m_mastInputs = new Dictionary<int, string>();
        #region 构造函数
        /// <summary>
        /// 功能描述:构造函数
        /// 作  者:HZH
        /// 创建日期:2019-08-05 10:57:26
        /// 任务编号:POS
        /// </summary>
        /// <param name="strTitle">窗体标题</param>
        /// <param name="args">输入项名称</param>
        /// <param name="inTypes">输入项对应输入类型,key:输入项名称,如不设置默认不控制输入</param>
        /// <param name="regexs">输入项对应正则规则,当imTypes=Regex时有效,key:输入项名称,如不设置默认不控制输入</param>
        /// <param name="keyBoards">文本框键盘,key:输入项名称,如不设置默认英文键盘</param>
        /// <param name="mastInputs">必填输入项名称</param>
        /// <param name="defaultValues">输入项默认值,key:输入项名称</param>
        public FrmInputs(
            string strTitle,
            string[] inPutLabels,
            Dictionary<string, TextInputType> inTypes = null,
            Dictionary<string, string> regexs = null,
            Dictionary<string, HZH_Controls.Controls.KeyBoardType> keyBoards = null,
            List<string> mastInputs = null,
            Dictionary<string, string> defaultValues = null)
        {
            InitializeComponent();
            this.Title = strTitle;
            if (inPutLabels.Length <= 0)
            {
                throw new Exception("输入数量不能为空");
            }
            try
            {
                Values = new string[inPutLabels.Length];
                HZH_Controls.ControlHelper.FreezeControl(this, true);

                for (int i = inPutLabels.Length - 1; i >= 0; i--)
                {
                    Panel p = new Panel();
                    p.Dock = DockStyle.Top;
                    p.Height = 62;
                    p.Padding = new Padding(10);

                    HZH_Controls.Controls.UCTextBoxEx txt = new Controls.UCTextBoxEx();
                    txt.Dock = DockStyle.Fill;
                    txt.IsShowKeyboard = true;
                    txt.IsShowClearBtn = true;
                    txt.Name = "txt_" + i;
                    txt.TabIndex = i;
                    if (inTypes != null && inTypes.ContainsKey(inPutLabels[i]))
                    {
                        txt.InputType = inTypes[inPutLabels[i]];
                        if (txt.InputType == TextInputType.Regex && regexs != null && regexs.ContainsKey(inPutLabels[i]))
                            txt.RegexPattern = regexs[inPutLabels[i]];
                    }
                    if (keyBoards != null && keyBoards.ContainsKey(inPutLabels[i]))
                        txt.KeyBoardType = keyBoards[inPutLabels[i]];
                    if (mastInputs != null && mastInputs.Contains(inPutLabels[i]))
                    {
                        m_mastInputs[i] = inPutLabels[i];
                    }
                    if (defaultValues != null && defaultValues.ContainsKey(inPutLabels[i]))
                        txt.InputText = defaultValues[inPutLabels[i]];
                    p.Controls.Add(txt);

                    Label lbl = new Label();
                    lbl.Text = inPutLabels[i];
                    lbl.Padding = new System.Windows.Forms.Padding(0, 0, 5, 0);
                    lbl.TextAlign = ContentAlignment.MiddleRight;
                    lbl.AutoSize = false;
                    lbl.Width = 120;
                    lbl.Dock = DockStyle.Left;
                    lbl.Font = new System.Drawing.Font("微软雅黑", 12);
                    p.Controls.Add(lbl);

                    Label lblT = new Label();
                    if (mastInputs != null && mastInputs.Contains(inPutLabels[i]))
                    {
                        lblT.Text = "*";
                    }
                    else
                    {
                        lblT.Text = "";
                    }
                    lblT.AutoSize = false;
                    lblT.TextAlign = ContentAlignment.MiddleLeft;
                    lblT.Width = 25;
                    lblT.Dock = DockStyle.Right;
                    lblT.Font = new System.Drawing.Font("微软雅黑", 12);
                    lblT.ForeColor = Color.Red;
                    p.Controls.Add(lblT);
                    this.panel3.Controls.Add(p);
                    this.ActiveControl = txt;
                }

                this.Height = 124 + inPutLabels.Length * 62;
            }
            finally
            {
                HZH_Controls.ControlHelper.FreezeControl(this, false);
            }
        }
        #endregion

        protected override void DoEnter()
        {
            for (int i = 0; i < Values.Length; i++)
            {
                var cs = this.panel3.Controls.Find("txt_" + i, true);
                if (cs.Length > 0)
                {
                    var txt = cs[0] as HZH_Controls.Controls.UCTextBoxEx;
                    Values[i] = txt.InputText;
                    if (m_mastInputs.ContainsKey(i) && string.IsNullOrWhiteSpace(txt.InputText))
                    {
                        HZH_Controls.Forms.FrmTips.ShowTipsInfo(this, "[" + m_mastInputs[i] + "]必须输入。");
                        return;
                    }
                }
            }
            base.DoEnter();
        }
    }
}

namespace HZH_Controls.Forms
{
    partial class FrmInputs
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // FrmInputs
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(427, 310);
            this.Name = "FrmInputs";
            this.Text = "FrmInputs";
            this.ResumeLayout(false);

        }

        #endregion


    }
}

用处及效果

用处:当需要输入多个文本时可用

效果:

调用示例

复制代码

1   FrmInputs frm = new FrmInputs("动态多输入窗体测试",
2                 new string[] { "姓名", "电话", "身份证号", "住址" },
3                 new Dictionary<string, HZH_Controls.TextInputType>() { { "电话", HZH_Controls.TextInputType.Regex }, { "身份证号", HZH_Controls.TextInputType.Regex } },
4                 new Dictionary<string, string>() { { "电话", "^1\\d{10}$" }, { "身份证号", "^\\d{18}$" } },
5                 new Dictionary<string, KeyBoardType>() { { "电话", KeyBoardType.UCKeyBorderNum }, { "身份证号", KeyBoardType.UCKeyBorderNum } },
6                 new List<string>() { "姓名", "电话", "身份证号" });
7             frm.ShowDialog(this);

复制代码

最后的话

如果你喜欢的话,请到 HZHControls控件库: HZHControls控件库,c#的winform自定义控件,对触屏具有更好的操作支持,项目是基于framework4.0,完全原生控件开发,没有使用任何第三方控件,你可以放心的用在你的项目中(winfromcontrol/winformcontrol/.net)。还有更丰富的工业控件持续增加中~~~ 点个星 星吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值