[WinForm]WinForm跨線程UI操作常用控制項類大全

来源:http://www.cnblogs.com/seayxu/archive/2016/05/24/5523026.html
-Advertisement-
Play Games

![圖片來自網路/圖文無關][0] 前言 在C 開發的WinForm窗體程式開發的時候,經常會使用多線程處理一些比較耗時之類的操作。不過會有一個問題:就是涉及到跨線程操作UI元素。 相信才開始接觸的人一定會遇上這個問題。 為瞭解決這個問題,可以通過委托來實現。 我為了後期使用更加方便,就將常用的幾個 ...


圖片來自網路/圖文無關

前言

在C#開發的WinForm窗體程式開發的時候,經常會使用多線程處理一些比較耗時之類的操作。不過會有一個問題:就是涉及到跨線程操作UI元素。
相信才開始接觸的人一定會遇上這個問題。

為瞭解決這個問題,可以通過委托來實現。

我為了後期使用更加方便,就將常用的幾個控制項(TextBox、Label、CheckBox、RadioButton、ProgressBar)UI操作進行了封裝,源碼可以在github上查看:GitHub倉庫地址
源碼在github倉庫中的XY.WINUI.ControlEx.InvokeEx文件夾中

測試窗體

使用示例

在測試項目中有使用的方法,這裡只做簡單介紹。
調用方法在Invokes類中,也可以使用單獨的類調用。

例如:在窗體中為tbName的TextBox設置和獲取值

//首先,使用命名空間
using XY.WINUI.ControlEx.InvokeEx;

//第一種
//設置TextBox的值
Invokes.SetTextBoxText(tbName,"TextBox文本");
//獲取TextBox的值
string value = Invokes.GetTextBoxText(tbName);


//第二種
//設置TextBox的值
TextBoxInvoke.SetTextBoxText(tbName,"TextBox文本");
//獲取TextBox的值
string value = TextBoxInvoke.GetTextBoxText(tbName);

GitHub源碼

幫助類源碼

集合類(Invokes.cs)
Invokes.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace XY.WINUI.ControlEx.InvokeEx
{
    public class Invokes
    {
        #region //Controls

        #region // TextBox
        /// <summary>
        /// 設置文本框文本
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Text"></param>
        public static void SetTextBoxText(TextBox Ctrl, string Text)
        {
            TextBoxInvoke.SetTextBoxText(Ctrl, Text);
        }

        /// <summary>
        /// 獲取文本框文本方法
        /// </summary>
        /// <param name="Ctrl"></param>
        public static string GetTextBoxText(TextBox Ctrl)
        {
            return TextBoxInvoke.GetTextBoxText(Ctrl); ;
        }
        #endregion

        #region // Label
        /// <summary>
        /// 設置標簽文本
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Text"></param>
        public static void SetLabelText(Label Ctrl, string Text)
        {
            LabelInvoke.SetLabelText(Ctrl, Text);
        }

        /// <summary>
        /// 獲取標簽文本方法
        /// </summary>
        /// <param name="Ctrl"></param>
        public static string GetLabelText(Label Ctrl)
        {
            return LabelInvoke.GetLabelText(Ctrl); ;
        }
        #endregion 

        #region // RadioButton
        /// <summary>
        /// 獲取單選按鈕選中狀態
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <returns></returns>
        public static bool GetRadioButtonChecked(RadioButton Ctrl)
        {
            return RadioButtonInvoke.GetRadioButtonChecked(Ctrl);
        }

        /// <summary>
        /// 設置單選按鈕選中狀態
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Checked"></param>
        public static void SetRadioButtonChecked(RadioButton Ctrl, bool Checked)
        {
            RadioButtonInvoke.SetRadioButtonChecked(Ctrl, Checked);
        }
        #endregion

        #region // CheckBox
        /// <summary>
        /// 獲取選擇按鈕選中狀態
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <returns></returns>
        public static bool GetCheckBoxChecked(CheckBox Ctrl)
        {
            return CheckBoxInvoke.GetCheckBoxChecked(Ctrl);
        }

        /// <summary>
        /// 設置選擇按鈕選中狀態
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Checked"></param>
        public static void SetCheckBoxChecked(CheckBox Ctrl, bool Checked)
        {
            CheckBoxInvoke.SetCheckBoxChecked(Ctrl, Checked);
        }
        #endregion

        #region // ProgressBar
        /// <summary>
        /// 獲取進度條值
        /// </summary>
        /// <param name="Ctrl"></param>
        public static int GetProgressBarValue(ProgressBar Ctrl)
        {
            return ProgressBarInvoke.GetProgressBarValue(Ctrl);
        }
        /// <summary>
        /// 設置進度條值
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        public static void SetProgressBarValue(ProgressBar Ctrl, int Value)
        {
            ProgressBarInvoke.SetProgressBarValue(Ctrl, Value);
        }

        /// <summary>
        /// 獲取進度條最小值
        /// </summary>
        /// <param name="Ctrl"></param>
        public static int GetProgressBarMinValue(ProgressBar Ctrl)
        {
            return ProgressBarInvoke.GetProgressBarMinValue(Ctrl);
        }
        /// <summary>
        /// 設置進度條最小值
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        public static void SetProgressBarMinValue(ProgressBar Ctrl, int Value)
        {
            ProgressBarInvoke.SetProgressBarMinValue(Ctrl, Value);
        }

        /// <summary>
        /// 獲取進度條最大值
        /// </summary>
        /// <param name="Ctrl"></param>
        public static int GetProgressBarMaxValue(ProgressBar Ctrl)
        {
            return ProgressBarInvoke.GetProgressBarMaxValue(Ctrl);
        }
        /// <summary>
        /// 設置進度條最大值
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        public static void SetProgressBarMaxValue(ProgressBar Ctrl, int Value)
        {
            ProgressBarInvoke.SetProgressBarMaxValue(Ctrl, Value);
        }
        #endregion

        #endregion

        #region // Common

        #region // Visible
        /// <summary>
        /// 獲取控制項是否可見委托
        /// </summary>
        /// <param name="Ctrl"></param>
        private delegate bool GetControlVisibleDelegate(Control Ctrl);
        /// <summary>
        /// 設置控制項是否可見委托
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Visible"></param>
        private delegate void SetControlVisibleDelegate(Control Ctrl, bool Visible);

        /// <summary>
        /// 獲取控制項是否可見方法
        /// </summary>
        /// <param name="Ctrl"></param>
        private static bool GetControlVisibleFunc(Control Ctrl)
        {
            return Ctrl.Visible;
        }

        /// <summary>
        /// 獲取控制項是否可見
        /// </summary>
        /// <param name="flag"></param>
        public static bool GetControlVisible(Control Ctrl)
        {
            return (bool)Ctrl.Invoke(new SetControlVisibleDelegate(SetControlVisibleFunc), new object[] { Ctrl });
        }

        /// <summary>
        /// 設置控制項是否可見方法
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Visible"></param>
        private static void SetControlVisibleFunc(Control Ctrl, bool Visible)
        {
            Ctrl.Visible = Visible;
            Ctrl.Refresh();
        }

        /// <summary>
        /// 設置控制項是否可見
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Visible"></param>
        public static void SetControlVisible(Control Ctrl, bool Visible)
        {
            Ctrl.Invoke(new SetControlVisibleDelegate(SetControlVisibleFunc), new object[] { Ctrl, Visible });
        } 
        #endregion

        #endregion
    }
}

文本框(TextBox)
TextBoxInvoke.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace XY.WINUI.ControlEx.InvokeEx
{
    /// <summary>
    /// TextBoxInvoke
    /// </summary>
    public class TextBoxInvoke
    {
        /// <summary>
        /// 獲取文本框文本委托
        /// </summary>
        /// <param name="Ctrl"></param>
        private delegate string GetTextBoxTextDelegate(TextBox Ctrl);
        /// <summary>
        /// 設置文本框文本委托
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Text"></param>
        private delegate void SetTextBoxTextDelegate(TextBox Ctrl, string Text);

        /// <summary>
        /// 獲取文本框文本方法
        /// </summary>
        /// <param name="Ctrl"></param>
        private static string GetTextBoxTextFunc(TextBox Ctrl)
        {
            return Ctrl.Text;
        }

        /// <summary>
        /// 獲取文本框文本
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <returns></returns>
        public static string GetTextBoxText(TextBox Ctrl)
        {
            return (string)Ctrl.Invoke(new GetTextBoxTextDelegate(GetTextBoxTextFunc), new object[] { Ctrl });
        }

        /// <summary>
        /// 設置文本框文本方法
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Text"></param>
        private static void SetTextBoxTextFunc(TextBox Ctrl, string Text)
        {
            Ctrl.Text = Text;
            Ctrl.Refresh();
        }

        /// <summary>
        /// 設置文本框文本
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Text"></param>
        public static void SetTextBoxText(TextBox Ctrl, string Text)
        {
            Ctrl.Invoke(new SetTextBoxTextDelegate(SetTextBoxTextFunc), new object[] { Ctrl, Text });
        }
    }
}

標簽(Label)
LabelInvoke.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace XY.WINUI.ControlEx.InvokeEx
{
    /// <summary>
    /// LabelInvoke
    /// </summary>
    public class LabelInvoke
    {
        /// <summary>
        /// 獲取標簽文本委托
        /// </summary>
        /// <param name="Ctrl"></param>
        private delegate string GetLabelTextDelegate(Label Ctrl);
        /// <summary>
        /// 設置標簽文本委托
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Text"></param>
        private delegate void SetLabelTextDelegate(Label Ctrl, string Text);

        /// <summary>
        /// 獲取標簽文本方法
        /// </summary>
        /// <param name="Ctrl"></param>
        private static string GetLabelTextFunc(Label Ctrl)
        {
            return Ctrl.Text;
        }

        /// <summary>
        /// 獲取標簽文本
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <returns></returns>
        public static string GetLabelText(Label Ctrl)
        {
            return (string)Ctrl.Invoke(new GetLabelTextDelegate(GetLabelTextFunc), new object[] { Ctrl });
        }

        /// <summary>
        /// 設置標簽文本方法
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Text"></param>
        private static void SetLabelTextFunc(Label Ctrl, string Text)
        {
            Ctrl.Text = Text;
            Ctrl.Refresh();
        }

        /// <summary>
        /// 設置標簽文本
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Text"></param>
        public static void SetLabelText(Label Ctrl, string Text)
        {
            Ctrl.Invoke(new SetLabelTextDelegate(SetLabelTextFunc), new object[] { Ctrl, Text });
        }
    }
}

覆選框(CheckBox)
CheckBoxInvoke.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace XY.WINUI.ControlEx.InvokeEx
{
    /// <summary>
    /// CheckBoxInvoke
    /// </summary>
    public class CheckBoxInvoke
    {
        /// <summary>
        /// 獲取選擇按鈕選中狀態委托
        /// </summary>
        /// <param name="Ctrl"></param>
        private delegate bool GetCheckBoxCheckedDelegate(CheckBox Ctrl);
        /// <summary>
        /// 設置選擇按鈕選中狀態委托
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Checked"></param>
        private delegate void SetCheckBoxCheckedDelegate(CheckBox Ctrl, bool Checked);

        /// <summary>
        /// 獲取選擇按鈕選中狀態方法
        /// </summary>
        /// <param name="Ctrl"></param>
        private static bool GetCheckBoxCheckedFunc(CheckBox Ctrl)
        {
            return Ctrl.Checked;
        }

        /// <summary>
        /// 獲取選擇按鈕選中狀態
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <returns></returns>
        public static bool GetCheckBoxChecked(CheckBox Ctrl)
        {
            return (bool)Ctrl.Invoke(new GetCheckBoxCheckedDelegate(GetCheckBoxCheckedFunc), new object[] { Ctrl });
        }

        /// <summary>
        /// 設置選擇按鈕選中狀態方法
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Checked"></param>
        private static void SetCheckBoxCheckedFunc(CheckBox Ctrl, bool Checked)
        {
            Ctrl.Checked = Checked;
            Ctrl.Refresh();
        }

        /// <summary>
        /// 設置選擇按鈕選中狀態
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Checked"></param>
        public static void SetCheckBoxChecked(CheckBox Ctrl, bool Checked)
        {
            Ctrl.Invoke(new SetCheckBoxCheckedDelegate(SetCheckBoxCheckedFunc), new object[] { Ctrl, Checked });
        }
    }
}

單選按鈕(RadioButton)
RadioButtonInvoke.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace XY.WINUI.ControlEx.InvokeEx
{
    /// <summary>
    /// RadioButtonInvoke
    /// </summary>
    public class RadioButtonInvoke
    {
        /// <summary>
        /// 獲取單選按鈕選中狀態委托
        /// </summary>
        /// <param name="Ctrl"></param>
        private delegate bool GetRadioButtonCheckedDelegate(RadioButton Ctrl);
        /// <summary>
        /// 設置單選按鈕選中狀態委托
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Checked"></param>
        private delegate void SetRadioButtonCheckedDelegate(RadioButton Ctrl, bool Checked);

        /// <summary>
        /// 獲取單選按鈕選中狀態方法
        /// </summary>
        /// <param name="Ctrl"></param>
        private static bool GetRadioButtonCheckedFunc(RadioButton Ctrl)
        {
            return Ctrl.Checked;
        }

        /// <summary>
        /// 獲取單選按鈕選中狀態
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <returns></returns>
        public static bool GetRadioButtonChecked(RadioButton Ctrl)
        {
            return (bool)Ctrl.Invoke(new GetRadioButtonCheckedDelegate(GetRadioButtonCheckedFunc), new object[] { Ctrl });
        }

        /// <summary>
        /// 設置單選按鈕選中狀態方法
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Checked"></param>
        private static void SetRadioButtonCheckedFunc(RadioButton Ctrl, bool Checked)
        {
            Ctrl.Checked = Checked;
            Ctrl.Refresh();
        }

        /// <summary>
        /// 設置單選按鈕選中狀態
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Checked"></param>
        public static void SetRadioButtonChecked(RadioButton Ctrl, bool Checked)
        {
            Ctrl.Invoke(new SetRadioButtonCheckedDelegate(SetRadioButtonCheckedFunc), new object[] { Ctrl, Checked });
        }
    }
}

進度條(ProgressBar)
ProgressBarInvoke.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace XY.WINUI.ControlEx.InvokeEx
{
    /// <summary>
    /// ProgressBarInvoke
    /// </summary>
    public class ProgressBarInvoke
    {
        /// <summary>
        /// 獲取進度條當前值委托
        /// </summary>
        /// <param name="Ctrl"></param>
        private delegate int GetProgressBarValueDelegate(ProgressBar Ctrl);
        /// <summary>
        /// 設置進度條當前值委托
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        private delegate void SetProgressBarValueDelegate(ProgressBar Ctrl, int Value);

        /// <summary>
        /// 獲取進度條最小值委托
        /// </summary>
        /// <param name="Ctrl"></param>
        private delegate int GetProgressBarMinValueDelegate(ProgressBar Ctrl);
        /// <summary>
        /// 設置進度條最小值委托
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        private delegate void SetProgressBarMinValueDelegate(ProgressBar Ctrl, int Value);

        /// <summary>
        /// 獲取進度條最大值委托
        /// </summary>
        /// <param name="Ctrl"></param>
        private delegate int GetProgressBarMaxValueDelegate(ProgressBar Ctrl);
        /// <summary>
        /// 設置進度條最大值委托
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        private delegate void SetProgressBarMaxValueDelegate(ProgressBar Ctrl, int Value);

        /// <summary>
        /// 獲取進度條當前值方法
        /// </summary>
        /// <param name="Ctrl"></param>
        private static int GetProgressBarValueFunc(ProgressBar Ctrl)
        {
            return Ctrl.Value;
        }

        /// <summary>
        /// 獲取進度條當前值
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <returns></returns>
        public static int GetProgressBarValue(ProgressBar Ctrl)
        {
            return (int)Ctrl.Invoke(new GetProgressBarValueDelegate(GetProgressBarValueFunc), new object[] { Ctrl });
        }

        /// <summary>
        /// 設置進度條當前值方法
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        private static void SetProgressBarValueFunc(ProgressBar Ctrl, int Value)
        {
            Ctrl.Value = Value;
            Ctrl.Refresh();
        }

        /// <summary>
        /// 設置進度條當前值
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        public static void SetProgressBarValue(ProgressBar Ctrl, int Value)
        {
            Ctrl.Invoke(new SetProgressBarValueDelegate(SetProgressBarValueFunc), new object[] { Ctrl, Value });
        }

        /// <summary>
        /// 獲取進度條最小值方法
        /// </summary>
        /// <param name="Ctrl"></param>
        private static int GetProgressBarMinValueFunc(ProgressBar Ctrl)
        {
            return Ctrl.Minimum;
        }

        /// <summary>
        /// 獲取進度條最小值
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <returns></returns>
        public static int GetProgressBarMinValue(ProgressBar Ctrl)
        {
            return (int)Ctrl.Invoke(new GetProgressBarValueDelegate(GetProgressBarMinValueFunc), new object[] { Ctrl });
        }

        /// <summary>
        /// 設置進度條最小值方法
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        private static void SetProgressBarMinValueFunc(ProgressBar Ctrl, int Value)
        {
            Ctrl.Minimum = Value;
            Ctrl.Refresh();
        }

        /// <summary>
        /// 設置進度條最小值
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        public static void SetProgressBarMinValue(ProgressBar Ctrl, int Value)
        {
            Ctrl.Invoke(new SetProgressBarValueDelegate(SetProgressBarMinValueFunc), new object[] { Ctrl, Value });
        }

        /// <summary>
        /// 獲取進度條最大值方法
        /// </summary>
        /// <param name="Ctrl"></param>
        private static int GetProgressBarMaxValueFunc(ProgressBar Ctrl)
        {
            return Ctrl.Maximum;
        }

        /// <summary>
        /// 獲取進度條最大值
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <returns></returns>
        public static int GetProgressBarMaxValue(ProgressBar Ctrl)
        {
            return (int)Ctrl.Invoke(new GetProgressBarValueDelegate(GetProgressBarMaxValueFunc), new object[] { Ctrl });
        }

        /// <summary>
        /// 設置進度條最大值方法
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        private static void SetProgressBarMaxValueFunc(ProgressBar Ctrl, int Value)
        {
            Ctrl.Maximum = Value;
            Ctrl.Refresh();
        }

        /// <summary>
        /// 設置進度條最大值
        /// </summary>
        /// <param name="Ctrl"></param>
        /// <param name="Value"></param>
        public static void SetProgressBarMaxValue(ProgressBar Ctrl, int Value)
        {
            Ctrl.Invoke(new SetProgressBarValueDelegate(SetProgressBarMaxValueFunc), new object[] { Ctrl, Value });
        }
    }
}

GitHub源碼

由於時間關係,暫時就封裝了這麼多。

會持續更新……

歡迎大家補充。

WinForm跨線程UI操作常用控制項類大全


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

-Advertisement-
Play Games
更多相關文章
  • 環境:Vs2103(TFS2013) 目的:去掉別人項目里的TFS控制,因為每次打開時會有提示信息 解決方法: 1.刪除隱藏的.$tf文件夾,搜索*.vssscc和*.vspscc這兩個尾碼的文件,刪除找到的文件. 2.使用文本編輯器打開*.sln文件,找到 GlobalSection(TeamFo ...
  • 剛到新單位,學習他們的源代碼,代碼里讀寫系統配置文件的XML代碼比較老套,直接寫在一個系統配置類里,沒有進行類的拆分,造成類很龐大,同時,操作XML的讀寫操作都是使用SetAttribute和node.Attribute(name)方法,因此,想到結合之前所做的XML操作,完成了一個能夠讀取XML文 ...
  • 寫入: 插入100萬條數據:用InsertMany,耗時16s左右。 讀取: 讀取300萬條數據,耗時3600毫秒。 ...
  • ...
  • 這次要分享的是C#Task任務的幾個列子,感覺最實用的是封裝的分頁任務執行方法,這個方法步奏也是目前在我工作中執行多任務常用的,不知道各位也有這用的情況,那麼開始吧。 1.順序任務執行 1 //順序任務執行 2 Task.Factory.StartNew<int>(() => { Console.W ...
  • 關於面試中涉及到的事件的問題,我們只需要抓住幾個關鍵點就好了: 定義事件: 5 } ...
  • 上接 WCF學習之旅—WCF服務部署到IIS7.5(九) WCF學習之旅—WCF服務部署到應用程式(十) 七 WCF服務的Windows 服務程式寄宿 這種方式的服務寄宿,和IIS一樣有一個一樣的優點,系統啟動後,WCF服務也會跟著啟動了,不用人工干預,也是一種較好的寄宿方式。 (1) 在解決方案下 ...
  • 相關博文: "ASP.NET 5 Target framework dnx451 and dnxcore50" .NET Platform Standard:https://github.com/dotnet/corefx/blob/master/Documentation/architecture ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...