(四十八)c#Winform自定義控制項-下拉按鈕

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

前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...


前提

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

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

碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

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

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

麻煩博客下方點個【推薦】,謝謝

NuGet

Install-Package HZH_Controls

目錄

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

用處及效果

準備工作

這個控制項將繼承自(三)c#Winform自定義控制項-有圖標的按鈕,如不瞭解,請移步查看

開始

添加一個用戶控制項UCDropDownBtn,繼承自UCBtnImg

處理一些屬性

 1 Forms.FrmAnchor _frmAnchor;
 2         private int _dropPanelHeight = -1;
 3         public new event EventHandler BtnClick;
 4         [Description("下拉框高度"), Category("自定義")]
 5         public int DropPanelHeight
 6         {
 7             get { return _dropPanelHeight; }
 8             set { _dropPanelHeight = value; }
 9         }
10         private string[] btns ;
11         [Description("按鈕"), Category("自定義")]
12         public string[] Btns
13         {
14             get { return btns; }
15             set { btns = value; }
16         }
17         [Obsolete("不再可用的屬性")]
18         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
19         public override Image Image
20         {
21             get;
22             set;
23         }
24         [Obsolete("不再可用的屬性")]
25         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
26         public override ContentAlignment ImageAlign
27         {
28             get;
29             set;
30         }

點擊時候顯示下拉框

 1 void UCDropDownBtn_BtnClick(object sender, EventArgs e)
 2         {
 3             if (_frmAnchor == null || _frmAnchor.IsDisposed || _frmAnchor.Visible == false)
 4             {
 5 
 6                 if (Btns != null && Btns.Length > 0)
 7                 {
 8                     int intRow = 0;
 9                     int intCom = 1;
10                     var p = this.PointToScreen(this.Location);
11                     while (true)
12                     {
13                         int intScreenHeight = Screen.PrimaryScreen.Bounds.Height;
14                         if ((p.Y + this.Height + Btns.Length / intCom * 50 < intScreenHeight || p.Y - Btns.Length / intCom * 50 > 0)
15                             && (_dropPanelHeight <= 0 ? true : (Btns.Length / intCom * 50 <= _dropPanelHeight)))
16                         {
17                             intRow = Btns.Length / intCom + (Btns.Length % intCom != 0 ? 1 : 0);
18                             break;
19                         }
20                         intCom++;
21                     }
22                     UCTimePanel ucTime = new UCTimePanel();
23                     ucTime.IsShowBorder = true;
24                     int intWidth = this.Width / intCom;
25 
26                     Size size = new Size(intCom * intWidth, intRow * 50);
27                     ucTime.Size = size;
28                     ucTime.FirstEvent = true;
29                     ucTime.SelectSourceEvent += ucTime_SelectSourceEvent;
30                     ucTime.Row = intRow;
31                     ucTime.Column = intCom;
32 
33                     List<KeyValuePair<string, string>> lst = new List<KeyValuePair<string, string>>();
34                     foreach (var item in Btns)
35                     {
36                         lst.Add(new KeyValuePair<string, string>(item, item));
37                     }
38                     ucTime.Source = lst;
39 
40                     _frmAnchor = new Forms.FrmAnchor(this, ucTime);
41                     _frmAnchor.Load += (a, b) => { (a as Form).Size = size; };
42 
43                     _frmAnchor.Show(this.FindForm());
44 
45                 }
46             }
47             else
48             {
49                 _frmAnchor.Close();
50             }
51         }

處理一下按鈕事件

 1 void ucTime_SelectSourceEvent(object sender, EventArgs e)
 2         {
 3             if (_frmAnchor != null && !_frmAnchor.IsDisposed && _frmAnchor.Visible)
 4             {
 5                 _frmAnchor.Close();
 6 
 7                 if (BtnClick != null)
 8                 {
 9                     BtnClick(sender.ToString(), e);
10                 }
11             }
12         }

完整代碼

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Drawing;
  5 using System.Data;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 
 10 namespace HZH_Controls.Controls.Btn
 11 {
 12     [DefaultEvent("BtnClick")]
 13     public partial class UCDropDownBtn : UCBtnImg
 14     {
 15         Forms.FrmAnchor _frmAnchor;
 16         private int _dropPanelHeight = -1;
 17         public new event EventHandler BtnClick;
 18         [Description("下拉框高度"), Category("自定義")]
 19         public int DropPanelHeight
 20         {
 21             get { return _dropPanelHeight; }
 22             set { _dropPanelHeight = value; }
 23         }
 24         private string[] btns ;
 25         [Description("按鈕"), Category("自定義")]
 26         public string[] Btns
 27         {
 28             get { return btns; }
 29             set { btns = value; }
 30         }
 31         [Obsolete("不再可用的屬性")]
 32         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 33         public override Image Image
 34         {
 35             get;
 36             set;
 37         }
 38         [Obsolete("不再可用的屬性")]
 39         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
 40         public override ContentAlignment ImageAlign
 41         {
 42             get;
 43             set;
 44         }
 45 
 46         public UCDropDownBtn()
 47         {
 48             InitializeComponent();
 49             IsShowTips = false;
 50             this.lbl.Image=Properties.Resources.ComboBox;
 51             this.lbl.ImageAlign = ContentAlignment.MiddleRight;
 52             base.BtnClick += UCDropDownBtn_BtnClick;
 53         }
 54 
 55         void UCDropDownBtn_BtnClick(object sender, EventArgs e)
 56         {
 57             if (_frmAnchor == null || _frmAnchor.IsDisposed || _frmAnchor.Visible == false)
 58             {
 59 
 60                 if (Btns != null && Btns.Length > 0)
 61                 {
 62                     int intRow = 0;
 63                     int intCom = 1;
 64                     var p = this.PointToScreen(this.Location);
 65                     while (true)
 66                     {
 67                         int intScreenHeight = Screen.PrimaryScreen.Bounds.Height;
 68                         if ((p.Y + this.Height + Btns.Length / intCom * 50 < intScreenHeight || p.Y - Btns.Length / intCom * 50 > 0)
 69                             && (_dropPanelHeight <= 0 ? true : (Btns.Length / intCom * 50 <= _dropPanelHeight)))
 70                         {
 71                             intRow = Btns.Length / intCom + (Btns.Length % intCom != 0 ? 1 : 0);
 72                             break;
 73                         }
 74                         intCom++;
 75                     }
 76                     UCTimePanel ucTime = new UCTimePanel();
 77                     ucTime.IsShowBorder = true;
 78                     int intWidth = this.Width / intCom;
 79 
 80                     Size size = new Size(intCom * intWidth, intRow * 50);
 81                     ucTime.Size = size;
 82                     ucTime.FirstEvent = true;
 83                     ucTime.SelectSourceEvent += ucTime_SelectSourceEvent;
 84                     ucTime.Row = intRow;
 85                     ucTime.Column = intCom;
 86 
 87                     List<KeyValuePair<string, string>> lst = new List<KeyValuePair<string, string>>();
 88                     foreach (var item in Btns)
 89                     {
 90                         lst.Add(new KeyValuePair<string, string>(item, item));
 91                     }
 92                     ucTime.Source = lst;
 93 
 94                     _frmAnchor = new Forms.FrmAnchor(this, ucTime);
 95                     _frmAnchor.Load += (a, b) => { (a as Form).Size = size; };
 96 
 97                     _frmAnchor.Show(this.FindForm());
 98 
 99                 }
100             }
101             else
102             {
103                 _frmAnchor.Close();
104             }
105         }
106         void ucTime_SelectSourceEvent(object sender, EventArgs e)
107         {
108             if (_frmAnchor != null && !_frmAnchor.IsDisposed && _frmAnchor.Visible)
109             {
110                 _frmAnchor.Close();
111 
112                 if (BtnClick != null)
113                 {
114                     BtnClick(sender.ToString(), e);
115                 }
116             }
117         }
118     }
119 }
View Code
 1 namespace HZH_Controls.Controls.Btn
 2 {
 3     partial class UCDropDownBtn
 4     {
 5         /// <summary> 
 6         /// 必需的設計器變數。
 7         /// </summary>
 8         private System.ComponentModel.IContainer components = null;
 9 
10         /// <summary> 
11         /// 清理所有正在使用的資源。
12         /// </summary>
13         /// <param name="disposing">如果應釋放托管資源,為 true;否則為 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 組件設計器生成的代碼
24 
25         /// <summary> 
26         /// 設計器支持所需的方法 - 不要
27         /// 使用代碼編輯器修改此方法的內容。
28         /// </summary>
29         private void InitializeComponent()
30         {
31             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(UCDropDownBtn));
32             this.SuspendLayout();
33             // 
34             // lbl
35             // 
36             this.lbl.Font = new System.Drawing.Font("微軟雅黑", 14F);
37             this.lbl.ForeColor = System.Drawing.Color.White;
38             this.lbl.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
39             this.lbl.ImageList = null;
40             this.lbl.Text = "自定義按鈕";
41             this.lbl.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
42             // 
43             // UCDropDownBtn
44             // 
45             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
46             this.BtnFont = new System.Drawing.Font("微軟雅黑", 14F);
47             this.BtnForeColor = System.Drawing.Color.White;
48             this.ForeColor = System.Drawing.Color.White;
49             this.Image = ((System.Drawing.Image)(resources.GetObject("$this.Image")));
50             this.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
51             this.Margin = new System.Windows.Forms.Padding(2);
52             this.Name = "UCDropDownBtn";
53             this.ResumeLayout(false);
54 
55         }
56 
57         #endregion
58     }
59 }
View Code

 

最後的話

如果你喜歡的話,請到 https://gitee.com/kwwwvagaa/net_winform_custom_control 點個星星吧


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

-Advertisement-
Play Games
更多相關文章
  • 前面介紹了單元測試的框架NUnit,它可以很好的幫助我們建立測試,檢驗我們的代碼是否正確。但這還不夠,有時候我們的業務比較重,會依賴其它的類。基於隔離測試的原則,我們不希望依賴的其它類影響到我們的測試目標。這時候Mock就顯得十分重要了。當然還有其它因素使得我們必須Mock對象,比如配置文件,DB等 ...
  • 客戶端實現了ILoggerFactory,使用服務註入成功後即可使用,對業務入侵非常小,也支持通過客戶端調用寫入日誌流。 ...
  • 常見面試題目: 1. 值類型和引用類型的區別? 2. 結構和類的區別? 3. delegate是引用類型還是值類型?enum、int[]和string呢? 4. 堆和棧的區別? 5. 什麼情況下會在堆(棧)上分配數據?它們有性能上的區別嗎? 6.“結構”對象可能分配在堆上嗎?什麼情況下會發生,有什麼 ...
  • 引用:https://www.cnblogs.com/zoe-yan/p/10374757.html 利用vs2017c#調用python腳本需要安裝IronPython。我是通過vs2017的工具->NuGet包管理器->管理解決方案的NuGet包,搜索IronPython包安裝,也可以在官網下載 ...
  • 場景 Winform控制項-DevExpress18下載安裝註冊以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100061243 參照以上將DevExpress安裝並引進到工具箱。 這裡使用的是VS2013所以安 ...
  • 在項目的搭建過程中不經意間看到一個關於以上標題三個符號的代碼,於是留心記錄一下,以備不時之需; 1. 可空類型修飾符(?): 引用類型可以使用空引用表示一個不存在的值,而值類型通常不能表示為空。 例如:string str=null; 是正確的,int i=null; 編譯器就會報錯。 為了使值類型 ...
  • 很久沒有部署IIS網站項目了,都有些手生了,這不今天就遇到了問題。首先確定的是,我的網站配置沒有問題,因為內網訪問正常。內網訪問情況如下: 但是外網訪問時確是這樣的: 怎麼回事兒呢?我就想是不是防火牆的問題?可是如果在伺服器上把防火牆關閉了,那豈不是很不安全?於是我就和我對面的同事(我們的網管,所以 ...
  • 場景 Winform控制項-DevExpress18下載安裝註冊以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100061243 參照以上將DevExpress安裝並引進到工具箱。 這裡使用的是VS2013所以安 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...