主頁 > .NET開發 > (八十二)c#Winform自定義控制元件-穿梭框-HZHControls

(八十二)c#Winform自定義控制元件-穿梭框-HZHControls

2020-09-11 08:25:44 .NET開發

官網

http://www.hzhcontrols.com

前提

入行已經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自定義控制元件-基類控制元件、(三)c#Winform自定義控制元件-有圖示的按鈕 、 (三十二)c#Winform自定義控制元件-表格  不了解的可以先移步查看一下

開始

添加一個用戶控制元件UCTestTransfer

界面放2個表格,2個按鈕即可

添加屬性

 1  /// <summary> 2         /// 移動資料事件 3         /// </summary> 4         [Description("移動資料事件"), Category("自定義")] 5         public event TransferEventHandler Transfered; 6  7         /// <summary> 8         /// The left columns 9         /// </summary>10         private DataGridViewColumnEntity[] leftColumns;11 12         /// <summary>13         /// Gets or sets the left columns.14         /// </summary>15         /// <value>The left columns.</value>16         [Description("左側串列列"), Category("自定義")]17         public DataGridViewColumnEntity[] LeftColumns18         {19             get { return leftColumns; }20             set21             {22                 leftColumns = value;23                 this.dgvLeft.Columns = leftColumns.ToList();24             }25         }26 27         /// <summary>28         /// The right columns29         /// </summary>30         private DataGridViewColumnEntity[] rightColumns;31 32         /// <summary>33         /// Gets or sets the right columns.34         /// </summary>35         /// <value>The right columns.</value>36         [Description("右側串列列"), Category("自定義")]37         public DataGridViewColumnEntity[] RightColumns38         {39             get { return rightColumns; }40             set41             {42                 rightColumns = value;43                 this.dgvRight.Columns = leftColumns.ToList();44             }45         }46 47         /// <summary>48         /// The left data source49         /// </summary>50         private object[] leftDataSource;51         /// <summary>52         /// 左右串列必須設定相同型別的資料源串列,如果為空必須為長度為0的陣列53         /// </summary>54         /// <value>The left data source.</value>55         [Description("左側串列資料源"), Category("自定義"), Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]56         public object[] LeftDataSource57         {58             get { return leftDataSource; }59             set60             {61                 leftDataSource = value;62                 dgvLeft.DataSource = value;63             }64         }65 66         /// <summary>67         /// The right data source68         /// </summary>69         private object[] rightDataSource;70         /// <summary>71         /// 左右串列必須設定相同型別的資料源串列,如果為空必須為長度為0的陣列72         /// </summary>73         /// <value>The left data source.</value>74         [Description("右側串列資料源"), Category("自定義"), Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]75         public object[] RightDataSource76         {77             get { return rightDataSource; }78             set79             {80                 rightDataSource = value;81                 dgvRight.DataSource = value;82             }83         }

處理左右移動按鈕事件

 1 /// <summary> 2         /// Handles the BtnClick event of the btnRight control. 3         /// </summary> 4         /// <param name="sender">The source of the event.</param> 5         /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> 6         /// <exception cref="System.Exception"> 7         /// 左右資料源串列不能為空 8         /// or 9         /// 左右資料源串列型別不一致,無法進行操作10         /// </exception>11         private void btnRight_BtnClick(object sender, EventArgs e)12         {13             if (LeftDataSource == null || RightDataSource == null)14             {15                 throw new Exception("左右資料源串列不能為空");16             }17             if (LeftDataSource.GetType() != RightDataSource.GetType())18             {19                 throw new Exception("左右資料源串列型別不一致,無法進行操作");20             }21             if (dgvLeft.SelectRows == null || dgvLeft.SelectRows.Count <= 0)22                 return;23             List<object> lst = new List<object>();24             dgvLeft.SelectRows.ForEach(p =>25             {26                 lst.Add(p.DataSource);27                 p.IsChecked = false;28             });29             var lstRight = RightDataSource.ToList();30             lstRight.AddRange(lst);31             var lstLeft = LeftDataSource.ToList();32             lstLeft.RemoveAll(p => lst.Contains(p));33             RightDataSource = lstRight.ToArray();34             LeftDataSource = lstLeft.ToArray();35             if (Transfered != null)36             {37                 Transfered(this, new TransferEventArgs() { TransferDataSource = lst.ToArray(), ToRightOrLeft = true });38             }39         }40 41         /// <summary>42         /// Handles the BtnClick event of the btnLeft control.43         /// </summary>44         /// <param name="sender">The source of the event.</param>45         /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>46         /// <exception cref="System.Exception">47         /// 左右資料源串列不能為空48         /// or49         /// 左右資料源串列型別不一致,無法進行操作50         /// </exception>51         private void btnLeft_BtnClick(object sender, EventArgs e)52         {53             if (LeftDataSource == null || RightDataSource == null)54             {55                 throw new Exception("左右資料源串列不能為空");56             }57             if (LeftDataSource.GetType() != RightDataSource.GetType())58             {59                 throw new Exception("左右資料源串列型別不一致,無法進行操作");60             }61             if (dgvRight.SelectRows == null || dgvRight.SelectRows.Count <= 0)62                 return;63             List<object> lst = new List<object>();64             dgvRight.SelectRows.ForEach(p =>65             {66                 lst.Add(p.DataSource);67                 p.IsChecked = false;68             });69             var lstLeft = LeftDataSource.ToList();70             lstLeft.AddRange(lst);71             var lstRight = RightDataSource.ToList();72             lstRight.RemoveAll(p => lst.Contains(p));73             RightDataSource = lstRight.ToArray();74             LeftDataSource = lstLeft.ToArray();75             if (Transfered != null)76             {77                 Transfered(this, new TransferEventArgs() { TransferDataSource = lst.ToArray(), ToRightOrLeft = false });78             }79         }

完整代碼

  1 // ***********************************************************************  2 // Assembly         : HZH_Controls  3 // Created          : 2019-10-10  4 //  5 // ***********************************************************************  6 // <copyright file="UCTransfer.cs">  7 //     Copyright by Huang Zhenghui(黃正輝) All, QQ group:568015492 QQ:623128629 Email:[email protected]  8 // </copyright>  9 // 10 // Blog: https://www.cnblogs.com/bfyx 11 // GitHub:https://github.com/kwwwvagaa/NetWinformControl 12 // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git 13 // 14 // If you use this code, please keep this note. 15 // *********************************************************************** 16 using System; 17 using System.Collections.Generic; 18 using System.ComponentModel; 19 using System.Drawing; 20 using System.Data; 21 using System.Linq; 22 using System.Text; 23 using System.Windows.Forms; 24  25 namespace HZH_Controls.Controls 26 { 27     /// <summary> 28     /// Class UCTransfer. 29     /// Implements the <see cref="System.Windows.Forms.UserControl" /> 30     /// </summary> 31     /// <seealso cref="System.Windows.Forms.UserControl" /> 32     [DefaultEvent("Transfered")] 33     public partial class UCTransfer : UserControl 34     { 35         /// <summary> 36         /// 移動資料事件 37         /// </summary> 38         [Description("移動資料事件"), Category("自定義")] 39         public event TransferEventHandler Transfered; 40  41         /// <summary> 42         /// The left columns 43         /// </summary> 44         private DataGridViewColumnEntity[] leftColumns; 45  46         /// <summary> 47         /// Gets or sets the left columns. 48         /// </summary> 49         /// <value>The left columns.</value> 50         [Description("左側串列列"), Category("自定義")] 51         public DataGridViewColumnEntity[] LeftColumns 52         { 53             get { return leftColumns; } 54             set 55             { 56                 leftColumns = value; 57                 this.dgvLeft.Columns = leftColumns.ToList(); 58             } 59         } 60  61         /// <summary> 62         /// The right columns 63         /// </summary> 64         private DataGridViewColumnEntity[] rightColumns; 65  66         /// <summary> 67         /// Gets or sets the right columns. 68         /// </summary> 69         /// <value>The right columns.</value> 70         [Description("右側串列列"), Category("自定義")] 71         public DataGridViewColumnEntity[] RightColumns 72         { 73             get { return rightColumns; } 74             set 75             { 76                 rightColumns = value; 77                 this.dgvRight.Columns = leftColumns.ToList(); 78             } 79         } 80  81         /// <summary> 82         /// The left data source 83         /// </summary> 84         private object[] leftDataSource; 85         /// <summary> 86         /// 左右串列必須設定相同型別的資料源串列,如果為空必須為長度為0的陣列 87         /// </summary> 88         /// <value>The left data source.</value> 89         [Description("左側串列資料源"), Category("自定義"), Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 90         public object[] LeftDataSource 91         { 92             get { return leftDataSource; } 93             set 94             { 95                 leftDataSource = value; 96                 dgvLeft.DataSource = value; 97             } 98         } 99 100         /// <summary>101         /// The right data source102         /// </summary>103         private object[] rightDataSource;104         /// <summary>105         /// 左右串列必須設定相同型別的資料源串列,如果為空必須為長度為0的陣列106         /// </summary>107         /// <value>The left data source.</value>108         [Description("右側串列資料源"), Category("自定義"), Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]109         public object[] RightDataSource110         {111             get { return rightDataSource; }112             set113             {114                 rightDataSource = value;115                 dgvRight.DataSource = value;116             }117         }118 119         /// <summary>120         /// Initializes a new instance of the <see cref="UCTransfer"/> class.121         /// </summary>122         public UCTransfer()123         {124             InitializeComponent();125             dgvLeft.IsCloseAutoHeight = true;126             dgvRight.IsCloseAutoHeight = true;127             LeftColumns = new DataGridViewColumnEntity[0];128             RightColumns = new DataGridViewColumnEntity[0];129             LeftDataSource = new object[0];130             RightDataSource = new object[0];131         }132 133         /// <summary>134         /// Handles the BtnClick event of the btnRight control.135         /// </summary>136         /// <param name="sender">The source of the event.</param>137         /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>138         /// <exception cref="System.Exception">139         /// 左右資料源串列不能為空140         /// or141         /// 左右資料源串列型別不一致,無法進行操作142         /// </exception>143         private void btnRight_BtnClick(object sender, EventArgs e)144         {145             if (LeftDataSource == null || RightDataSource == null)146             {147                 throw new Exception("左右資料源串列不能為空");148             }149             if (LeftDataSource.GetType() != RightDataSource.GetType())150             {151                 throw new Exception("左右資料源串列型別不一致,無法進行操作");152             }153             if (dgvLeft.SelectRows == null || dgvLeft.SelectRows.Count <= 0)154                 return;155             List<object> lst = new List<object>();156             dgvLeft.SelectRows.ForEach(p =>157             {158                 lst.Add(p.DataSource);159                 p.IsChecked = false;160             });161             var lstRight = RightDataSource.ToList();162             lstRight.AddRange(lst);163             var lstLeft = LeftDataSource.ToList();164             lstLeft.RemoveAll(p => lst.Contains(p));165             RightDataSource = lstRight.ToArray();166             LeftDataSource = lstLeft.ToArray();167             if (Transfered != null)168             {169                 Transfered(this, new TransferEventArgs() { TransferDataSource = lst.ToArray(), ToRightOrLeft = true });170             }171         }172 173         /// <summary>174         /// Handles the BtnClick event of the btnLeft control.175         /// </summary>176         /// <param name="sender">The source of the event.</param>177         /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>178         /// <exception cref="System.Exception">179         /// 左右資料源串列不能為空180         /// or181         /// 左右資料源串列型別不一致,無法進行操作182         /// </exception>183         private void btnLeft_BtnClick(object sender, EventArgs e)184         {185             if (LeftDataSource == null || RightDataSource == null)186             {187                 throw new Exception("左右資料源串列不能為空");188             }189             if (LeftDataSource.GetType() != RightDataSource.GetType())190             {191                 throw new Exception("左右資料源串列型別不一致,無法進行操作");192             }193             if (dgvRight.SelectRows == null || dgvRight.SelectRows.Count <= 0)194                 return;195             List<object> lst = new List<object>();196             dgvRight.SelectRows.ForEach(p =>197             {198                 lst.Add(p.DataSource);199                 p.IsChecked = false;200             });201             var lstLeft = LeftDataSource.ToList();202             lstLeft.AddRange(lst);203             var lstRight = RightDataSource.ToList();204             lstRight.RemoveAll(p => lst.Contains(p));205             RightDataSource = lstRight.ToArray();206             LeftDataSource = lstLeft.ToArray();207             if (Transfered != null)208             {209                 Transfered(this, new TransferEventArgs() { TransferDataSource = lst.ToArray(), ToRightOrLeft = false });210             }211         }212     }213 }

 

最后的話

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/4910.html

標籤:WinForm

上一篇:WInforn中設定ZedGraph的焦點顯示坐標格式化以及顯示三個坐標數的解決辦法

下一篇:Winforn中設定ZedGraph多條Y軸時曲線刻度不均勻問題解決

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more