(二十八)c#Winform自定義控制項-文本框(一)

来源:https://www.cnblogs.com/bfyx/archive/2019/08/16/11364359.html
-Advertisement-
Play Games

前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 開源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 如果覺得寫的還行,請點個 star 支持一下吧 歡迎前來交流探討: 企鵝群568015492 目錄 ...


前提

入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。

開源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control

如果覺得寫的還行,請點個 star 支持一下吧

歡迎前來交流探討: 企鵝群568015492 企鵝群568015492

目錄

https://www.cnblogs.com/bfyx/p/11364884.html

準備工作

終於到文本框了,文本框將包含原文本框擴展,透明文本框,數字輸入文本框,帶邊框文本框

本文將講解原文本框擴展,主要增加水印和輸入控制

開始

添加一個組件,命名TextBoxEx,繼承TextBox

屬性

  1 private bool blnFocus = false;
  2 
  3         private string _promptText = string.Empty;
  4 
  5         private Font _promptFont = new Font("微軟雅黑", 15f, FontStyle.Regular, GraphicsUnit.Pixel);
  6 
  7         private Color _promptColor = Color.Gray;
  8 
  9         private Rectangle _myRectangle = Rectangle.FromLTRB(1, 3, 1000, 3);
 10 
 11         private TextInputType _inputType = TextInputType.NotControl;
 12 
 13         private string _regexPattern = "";
 14 
 15         private string m_strOldValue = string.Empty;
 16 
 17         private decimal _maxValue = 1000000m;
 18 
 19         private decimal _minValue = -1000000m;
 20 
 21         private int _decLength = 2;
 22 
 23         /// <summary>
 24         /// 水印文字
 25         /// </summary>
 26         [Description("水印文字"), Category("自定義")]
 27         public string PromptText
 28         {
 29             get
 30             {
 31                 return this._promptText;
 32             }
 33             set
 34             {
 35                 this._promptText = value;
 36                 this.OnPaint(null);
 37             }
 38         }
 39 
 40         [Description("水印字體"), Category("自定義")]
 41         public Font PromptFont
 42         {
 43             get
 44             {
 45                 return this._promptFont;
 46             }
 47             set
 48             {
 49                 this._promptFont = value;
 50             }
 51         }
 52 
 53         [Description("水印顏色"), Category("自定義")]
 54         public Color PromptColor
 55         {
 56             get
 57             {
 58                 return this._promptColor;
 59             }
 60             set
 61             {
 62                 this._promptColor = value;
 63             }
 64         }
 65 
 66         public Rectangle MyRectangle
 67         {
 68             get;
 69             set;
 70         }
 71 
 72         public string OldText
 73         {
 74             get;
 75             set;
 76         }
 77 
 78         [Description("獲取或設置一個值,該值指示文本框中的文本輸入類型。")]
 79         public TextInputType InputType
 80         {
 81             get
 82             {
 83                 return this._inputType;
 84             }
 85             set
 86             {
 87                 this._inputType = value;
 88                 if (value != TextInputType.NotControl)
 89                 {
 90                     TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
 91                     TextChanged += new EventHandler(this.TextBoxEx_TextChanged);
 92                 }
 93                 else
 94                 {
 95                     TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
 96                 }
 97             }
 98         }
 99         /// <summary>
100         /// 獲取或設置一個值,該值指示當輸入類型InputType=Regex時,使用的正則表達式。
101         /// </summary>
102         [Description("獲取或設置一個值,該值指示當輸入類型InputType=Regex時,使用的正則表達式。")]
103         public string RegexPattern
104         {
105             get
106             {
107                 return this._regexPattern;
108             }
109             set
110             {
111                 this._regexPattern = value;
112             }
113         }
114         /// <summary>
115         /// 當InputType為數字類型時,能輸入的最大值
116         /// </summary>
117         [Description("當InputType為數字類型時,能輸入的最大值。")]
118         public decimal MaxValue
119         {
120             get
121             {
122                 return this._maxValue;
123             }
124             set
125             {
126                 this._maxValue = value;
127             }
128         }
129         /// <summary>
130         /// 當InputType為數字類型時,能輸入的最小值
131         /// </summary>
132         [Description("當InputType為數字類型時,能輸入的最小值。")]
133         public decimal MinValue
134         {
135             get
136             {
137                 return this._minValue;
138             }
139             set
140             {
141                 this._minValue = value;
142             }
143         }
144         /// <summary>
145         /// 當InputType為數字類型時,能輸入的最小值
146         /// </summary>
147         [Description("當InputType為數字類型時,小數位數。")]
148         public int DecLength
149         {
150             get
151             {
152                 return this._decLength;
153             }
154             set
155             {
156                 this._decLength = value;
157             }
158         }

一些事件

 1 void TextBoxEx_KeyPress(object sender, KeyPressEventArgs e)
 2         {
 3             //以下代碼  取消按下回車或esc的“叮”聲
 4             if (e.KeyChar == System.Convert.ToChar(13) || e.KeyChar == System.Convert.ToChar(27))
 5             {
 6                 e.Handled = true;
 7             }
 8         }
 9 
10         private void TextBoxEx_MouseUp(object sender, MouseEventArgs e)
11         {
12             if (this.blnFocus)
13             {
14                 base.SelectAll();
15                 this.blnFocus = false;
16             }
17         }
18 
19         private void TextBoxEx_GotFocus(object sender, EventArgs e)
20         {
21             this.blnFocus = true;
22             base.SelectAll();
23         }
24 
25         private void TextBoxEx_TextChanged(object sender, EventArgs e)
26         {
27             if (this.Text == "")
28             {
29                 this.m_strOldValue = this.Text;
30             }
31             else if (this.m_strOldValue != this.Text)
32             {
33                 if (!ControlHelper.CheckInputType(this.Text, this._inputType, this._maxValue, this._minValue, this._decLength, this._regexPattern))
34                 {
35                     int num = base.SelectionStart;
36                     if (this.m_strOldValue.Length < this.Text.Length)
37                     {
38                         num--;
39                     }
40                     else
41                     {
42                         num++;
43                     }
44                     base.TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
45                     this.Text = this.m_strOldValue;
46                     base.TextChanged += new EventHandler(this.TextBoxEx_TextChanged);
47                     if (num < 0)
48                     {
49                         num = 0;
50                     }
51                     base.SelectionStart = num;
52                 }
53                 else
54                 {
55                     this.m_strOldValue = this.Text;
56                 }
57             }
58         }

重繪

 1  protected override void OnPaint(PaintEventArgs e)
 2         {
 3             base.OnPaint(e);
 4             if (string.IsNullOrEmpty(this.Text) && !string.IsNullOrEmpty(this._promptText))
 5             {
 6                 if (e == null)
 7                 {
 8                     using (Graphics graphics = Graphics.FromHwnd(base.Handle))
 9                     {
10                         if (this.Text.Length == 0 && !string.IsNullOrEmpty(this.PromptText))
11                         {
12                             TextFormatFlags textFormatFlags = TextFormatFlags.EndEllipsis | TextFormatFlags.VerticalCenter;
13                             if (this.RightToLeft == RightToLeft.Yes)
14                             {
15                                 textFormatFlags |= (TextFormatFlags.Right | TextFormatFlags.RightToLeft);
16                             }
17                             TextRenderer.DrawText(graphics, this.PromptText, this._promptFont, base.ClientRectangle, this._promptColor, textFormatFlags);
18                         }
19                     }
20                 }
21             }
22         }

下麵是完整代碼

  1 // 版權所有  黃正輝  交流群:568015492   QQ:623128629
  2 // 文件名稱:TextBoxEx.cs
  3 // 創建日期:2019-08-15 16:03:44
  4 // 功能描述:TextBox
  5 // 項目地址:https://gitee.com/kwwwvagaa/net_winform_custom_control
  6 using System;
  7 using System.Collections.Generic;
  8 using System.ComponentModel;
  9 using System.Diagnostics;
 10 using System.Drawing;
 11 using System.Linq;
 12 using System.Text;
 13 using System.Windows.Forms;
 14 
 15 namespace HZH_Controls.Controls
 16 {
 17     public partial class TextBoxEx : TextBox
 18     {
 19         private bool blnFocus = false;
 20 
 21         private string _promptText = string.Empty;
 22 
 23         private Font _promptFont = new Font("微軟雅黑", 15f, FontStyle.Regular, GraphicsUnit.Pixel);
 24 
 25         private Color _promptColor = Color.Gray;
 26 
 27         private Rectangle _myRectangle = Rectangle.FromLTRB(1, 3, 1000, 3);
 28 
 29         private TextInputType _inputType = TextInputType.NotControl;
 30 
 31         private string _regexPattern = "";
 32 
 33         private string m_strOldValue = string.Empty;
 34 
 35         private decimal _maxValue = 1000000m;
 36 
 37         private decimal _minValue = -1000000m;
 38 
 39         private int _decLength = 2;
 40 
 41         /// <summary>
 42         /// 水印文字
 43         /// </summary>
 44         [Description("水印文字"), Category("自定義")]
 45         public string PromptText
 46         {
 47             get
 48             {
 49                 return this._promptText;
 50             }
 51             set
 52             {
 53                 this._promptText = value;
 54                 this.OnPaint(null);
 55             }
 56         }
 57 
 58         [Description("水印字體"), Category("自定義")]
 59         public Font PromptFont
 60         {
 61             get
 62             {
 63                 return this._promptFont;
 64             }
 65             set
 66             {
 67                 this._promptFont = value;
 68             }
 69         }
 70 
 71         [Description("水印顏色"), Category("自定義")]
 72         public Color PromptColor
 73         {
 74             get
 75             {
 76                 return this._promptColor;
 77             }
 78             set
 79             {
 80                 this._promptColor = value;
 81             }
 82         }
 83 
 84         public Rectangle MyRectangle
 85         {
 86             get;
 87             set;
 88         }
 89 
 90         public string OldText
 91         {
 92             get;
 93             set;
 94         }
 95 
 96         [Description("獲取或設置一個值,該值指示文本框中的文本輸入類型。")]
 97         public TextInputType InputType
 98         {
 99             get
100             {
101                 return this._inputType;
102             }
103             set
104             {
105                 this._inputType = value;
106                 if (value != TextInputType.NotControl)
107                 {
108                     TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
109                     TextChanged += new EventHandler(this.TextBoxEx_TextChanged);
110                 }
111                 else
112                 {
113                     TextChanged -= new EventHandler(this.TextBoxEx_TextChanged);
114                 }
115             }
116         }
117         /// <summary>
118         /// 獲取或設置一個值,該值指示當輸入類型InputType=Regex時,使用的正則表達式。
119         /// </summary>
120         [Description("獲取或設置一個值,該值指示當輸入類型InputType=Regex時,使用的正則表達式。")]
121         public string RegexPattern
122         {
123             get
124             {
125                 return this._regexPattern;
126             }
127             set
128             {
129                 this._regexPattern = value;
130             }
131         }
132         /// <summary>
133         /// 當InputType為數字類型時,能輸入的最大值
134         /// </summary>
135         [Description("當InputType為數字類型時,能輸入的最大值。")]
136         public decimal MaxValue
137         {
138             get
139             {
140                 return this._maxValue;
141             }
142             set
143             {
144                 this._maxValue = value;
145             }
146         }
147         /// <summary>
148         /// 當InputType為數字類型時,能輸入的最小值
149         /// </summary>
150         [Description("當InputType為數字類型時,能輸入的最小值。")]
151         public decimal MinValue
152         {
153             get
154             {
155                 return this._minValue;
156             }
157             set
158             {
159                 this._minValue = value;
160             }
161         }
162         /// <summary>
163         /// 當InputType為數字類型時,能輸入的最小值
164         /// </summary>
165         [Description("當InputType為數字類型時,小數位數。")]
166         public int DecLength
167         {
168             get
169             {
170                 return this._decLength;
171             }
172             set
173             {
174                 this._decLength = value;
175             }
176         }
177 
178         public TextBoxEx()
179         {
180             this.InitializeComponent();
181             base.GotFocus += new EventHandler(this.TextBoxEx_GotFocus);
182             base.MouseUp += new MouseEventHandler(this.TextBoxEx_MouseUp);
183             base.KeyPress += TextBoxEx_KeyPress;
184         }
185 
186         void TextBoxEx_KeyPress(object sender, KeyPressEventArgs e)
187         {
188             //以下代碼  取消按下回車或esc的“叮”聲
189             if (e.KeyChar == System.Convert.ToChar(13) || e.KeyChar == System.Convert.ToChar(27))
190             {
191                 e.Handled = true;
192             }
193         }
194 
195         private void TextBoxEx_MouseUp(object sender, MouseEventArgs e)
196         {
197             if (this.blnFocus)
198             {
199                 base.SelectAll();
200                 this.blnFocus = false;
201             }
202         }
203 
204         private void TextBoxEx_GotFocus(object sender, EventArgs e)
205         {
206             this.blnFocus = true;
207             base.SelectAll();
208         }
209 
210         private void TextBoxEx_TextChanged(object sender, EventArgs e)
211         {
212             if (this.Text == "")
213             {
214                 this.m_strOldValue = this.Text;
215             }
216             else if (this.m_strOldValue != this.Text)
217             {
218                 if (!ControlHelper.CheckInputType(this.Text, this._inputType, this._maxValue, this._minValue, this._decLength, this._regexPattern))
219                 {
220                     int num = base.SelectionStart;
221                     

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 類與對象,類是類別、種類,是面向對象設計中最重要的概念, # 對象是特征與技能的結合體, # 類是一系列對象相似特征與技能的結合體 # 例如:人是一個類,而我本人是一個對象,手,腳,是我的特征, # 吃放,睡覺,學習,是我所掌握的技能 # 在編程中的類也有兩種特征, # 數據屬性,函數屬性。 c... ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 開源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 如果覺得寫的還行,請點個 star 支持一下吧 歡迎前來交流探討: 企鵝群568015492 自定 ...
  • 生成ContextMenuStrip 將docMenu添加到treeView中去 添加綁定事件(函數名稱要和上面綁定時候的名稱一樣) ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 開源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 如果覺得寫的還行,請點個 star 支持一下吧 歡迎前來交流探討: 企鵝群568015492 目錄 ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 開源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 如果覺得寫的還行,請點個 star 支持一下吧 歡迎前來交流探討: 企鵝群568015492 目錄 ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 開源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 如果覺得寫的還行,請點個 star 支持一下吧 歡迎前來交流探討: 企鵝群568015492 目錄 ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 開源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 如果覺得寫的還行,請點個 star 支持一下吧 歡迎前來交流探討: 企鵝群568015492 目錄 ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 開源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 如果覺得寫的還行,請點個 star 支持一下吧 歡迎前來交流探討: 企鵝群568015492 目錄 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...