前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
目录
https://www.cnblogs.com/bfyx/p/11364884.html
准备工作
这个窗体继承子基类窗体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 }
完整代码如下
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 // 版权所有 黄正辉 交流群:568015492 QQ:623128629 2 // 文件名称:FrmInputs.cs 3 // 创建日期:2019-08-15 16:04:41 4 // 功能描述:FrmInputs 5 // 项目地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 6 using System; 7 using System.Collections.Generic; 8 using System.ComponentModel; 9 using System.Data; 10 using System.Drawing; 11 using System.Linq; 12 using System.Text; 13 using System.Windows.Forms; 14 15 namespace HZH_Controls.Forms 16 { 17 public partial class FrmInputs : FrmWithOKCancel1 18 { 19 public string[] Values { get; private set; } 20 private Dictionary<int, string> m_mastInputs = new Dictionary<int, string>(); 21 #region 构造函数 22 /// <summary> 23 /// 功能描述:构造函数 24 /// 作 者:HZH 25 /// 创建日期:2019-08-05 10:57:26 26 /// 任务编号:POS 27 /// </summary> 28 /// <param name="strTitle">窗体标题</param> 29 /// <param name="args">输入项名称</param> 30 /// <param name="inTypes">输入项对应输入类型,key:输入项名称,如不设置默认不控制输入</param> 31 /// <param name="regexs">输入项对应正则规则,当imTypes=Regex时有效,key:输入项名称,如不设置默认不控制输入</param> 32 /// <param name="keyBoards">文本框键盘,key:输入项名称,如不设置默认英文键盘</param> 33 /// <param name="mastInputs">必填输入项名称</param> 34 /// <param name="defaultValues">输入项默认值,key:输入项名称</param> 35 public FrmInputs( 36 string strTitle, 37 string[] inPutLabels, 38 Dictionary<string, TextInputType> inTypes = null, 39 Dictionary<string, string> regexs = null, 40 Dictionary<string, HZH_Controls.Controls.KeyBoardType> keyBoards = null, 41 List<string> mastInputs = null, 42 Dictionary<string, string> defaultValues = null) 43 { 44 InitializeComponent(); 45 this.Title = strTitle; 46 if (inPutLabels.Length <= 0) 47 { 48 throw new Exception("输入数量不能为空"); 49 } 50 try 51 { 52 Values = new string[inPutLabels.Length]; 53 HZH_Controls.ControlHelper.FreezeControl(this, true); 54 55 for (int i = inPutLabels.Length - 1; i >= 0; i--) 56 { 57 Panel p = new Panel(); 58 p.Dock = DockStyle.Top; 59 p.Height = 62; 60 p.Padding = new Padding(10); 61 62 HZH_Controls.Controls.UCTextBoxEx txt = new Controls.UCTextBoxEx(); 63 txt.Dock = DockStyle.Fill; 64 txt.IsShowKeyboard = true; 65 txt.IsShowClearBtn = true; 66 txt.Name = "txt_" + i; 67 txt.TabIndex = i; 68 if (inTypes != null && inTypes.ContainsKey(inPutLabels[i])) 69 { 70 txt.InputType = inTypes[inPutLabels[i]]; 71 if (txt.InputType == TextInputType.Regex && regexs != null && regexs.ContainsKey(inPutLabels[i])) 72 txt.RegexPattern = regexs[inPutLabels[i]]; 73 } 74 if (keyBoards != null && keyBoards.ContainsKey(inPutLabels[i])) 75 txt.KeyBoardType = keyBoards[inPutLabels[i]]; 76 if (mastInputs != null && mastInputs.Contains(inPutLabels[i])) 77 { 78 m_mastInputs[i] = inPutLabels[i]; 79 } 80 if (defaultValues != null && defaultValues.ContainsKey(inPutLabels[i])) 81 txt.InputText = defaultValues[inPutLabels[i]]; 82 p.Controls.Add(txt); 83 84 Label lbl = new Label(); 85 lbl.Text = inPutLabels[i]; 86 lbl.Padding = new System.Windows.Forms.Padding(0, 0, 5, 0); 87 lbl.TextAlign = ContentAlignment.MiddleRight; 88 lbl.AutoSize = false; 89 lbl.Width = 120; 90 lbl.Dock = DockStyle.Left; 91 lbl.Font = new System.Drawing.Font("微软雅黑", 12); 92 p.Controls.Add(lbl); 93 94 Label lblT = new Label(); 95 if (mastInputs != null && mastInputs.Contains(inPutLabels[i])) 96 { 97 lblT.Text = "*"; 98 } 99 else 100 { 101 lblT.Text = ""; 102 } 103 lblT.AutoSize = false; 104 lblT.TextAlign = ContentAlignment.MiddleLeft; 105 lblT.Width = 25; 106 lblT.Dock = DockStyle.Right; 107 lblT.Font = new System.Drawing.Font("微软雅黑", 12); 108 lblT.ForeColor = Color.Red; 109 p.Controls.Add(lblT); 110 this.panel3.Controls.Add(p); 111 this.ActiveControl = txt; 112 } 113 114 this.Height = 124 + inPutLabels.Length * 62; 115 } 116 finally 117 { 118 HZH_Controls.ControlHelper.FreezeControl(this, false); 119 } 120 } 121 #endregion 122 123 protected override void DoEnter() 124 { 125 for (int i = 0; i < Values.Length; i++) 126 { 127 var cs = this.panel3.Controls.Find("txt_" + i, true); 128 if (cs.Length > 0) 129 { 130 var txt = cs[0] as HZH_Controls.Controls.UCTextBoxEx; 131 Values[i] = txt.InputText; 132 if (m_mastInputs.ContainsKey(i) && string.IsNullOrWhiteSpace(txt.InputText)) 133 { 134 HZH_Controls.Forms.FrmTips.ShowTipsInfo(this, "[" + m_mastInputs[i] + "]必须输入。"); 135 return; 136 } 137 } 138 } 139 base.DoEnter(); 140 } 141 } 142 }
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 namespace HZH_Controls.Forms 2 { 3 partial class FrmInputs 4 { 5 /// <summary> 6 /// Required designer variable. 7 /// </summary> 8 private System.ComponentModel.IContainer components = null; 9 10 /// <summary> 11 /// Clean up any resources being used. 12 /// </summary> 13 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 14 protected override void Dispose(bool disposing) 15 { 16 if (disposing && (components != null)) 17 { 18 components.Dispose(); 19 } 20 base.Dispose(disposing); 21 } 22 23 #region Windows Form Designer generated code 24 25 /// <summary> 26 /// Required method for Designer support - do not modify 27 /// the contents of this method with the code editor. 28 /// </summary> 29 private void InitializeComponent() 30 { 31 this.SuspendLayout(); 32 // 33 // FrmInputs 34 // 35 this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); 36 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 37 this.ClientSize = new System.Drawing.Size(427, 310); 38 this.Name = "FrmInputs"; 39 this.Text = "FrmInputs"; 40 this.ResumeLayout(false); 41 42 } 43 44 #endregion 45 46 47 } 48 }
用处及效果
用处:当需要输入多个文本时可用
效果:
调用示例
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);
最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星 星吧