在WinForm中使用委托來在其他線程中改變控件的顯示


假設winform中有兩個控件:

1.ListView用來顯示進度的文本提示,ID:listView_progressInfo

2.ProgressBar用來顯示進度,ID:progressBar1

 

在此winform的后台.cs文件中聲明兩個公用委托類型:ControlChanger, ProgressChanger

    public delegate void ControlChanger(string progressText);
    public delegate void ProgressChanger(int current, int total);

 

並且編寫操作上面兩個控件的函數,它們都在此winform的線程內運行,故修改控件時不會報“非創建控件的線程不可修改控件”的錯誤:

        public void AddProgressIntoListView(string text)
        {
            if (listView_progressInfo.InvokeRequired) { ControlChanger outdelegate = new ControlChanger(AddProgressIntoListView); this.BeginInvoke(outdelegate, new object[] { text }); return; } listView_progressInfo.Items.Add(new ListViewItem(text)); } public void SetProgressBarValue(int current, int total) { if (progressBar1.InvokeRequired) { ProgressChanger outdelegate = new ProgressChanger(SetProgressBarValue); this.BeginInvoke(outdelegate, new object[] { current, total }); return; } progressBar1.Value = (int)(100 * current / total); }

 

檢查控件InvokeRequired屬性是為了保證安全地訪問控件,參考微軟知識庫:

https://msdn.microsoft.com/en-us/library/ms171728(v=vs.110).aspx

新建一個類用來操作winform中的控件: 

    public class ControlChange
    {
        public ControlChanger cc = null; public ProgressChanger pc = null; public void ChangeControlAndProgress() { int taskCount = 100; for (int i = 0; i <= taskCount; i++) { if (null != cc) { cc(string.Format("任務進行中,進度{0}%", i)); } if (null != cc) { pc(i,taskCount); } System.Threading.Thread.Sleep(500); } } }

然后在觸發器中(可以是一個按鈕)寫入如下代碼:

        private void button_start_Click(object sender, EventArgs e)
        {
            ControlChange controlchange = new ControlChange(); controlchange.cc = new ControlChanger(AddProgressIntoListView);//將ControlChanger委托類型的變量cc實例化 controlchange.pc = new ProgressChanger(SetProgressBarValue);//將ProgressChanger委托類型的變量cc實例化 new Thread(new ThreadStart(controlchange.ChangeControlAndProgress)).Start();//新建線程來運行ControlChange中的修改控件的方法ChangeControlAndProgress }

觸發器觸發后即可看到窗體中的進度提示和進度條在走。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM