WinForm 畫面為什麼不會更新

當在寫迴圈時,更改Form上的object,但無法即時更新嗎? 只要在更改object後加入 this.Refresh(); 即可。

using System;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private int x = 0;
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {
                ShowText(i + 1);
                this.Refresh(); //加入這行
                System.Threading.Thread.Sleep(100);
            }
        }

        //顯示文字到label
        private void ShowText(int i)
        {
            label1.Text = i.ToString();
        }
    }
}

  2012-06-04      ez      .NET
跨執行緒存取UI

WinFrom在執行緒下存取From上的物件會出現以下錯誤:

此時有三種方式可以解決,建議使用委派方式:

 

直接允許Cross Thread:

在WinFrom Load中加入:Form.CheckForIllegalCrossThreadCalls = false;


  2012-06-04      ez      .NET
等待多個 Thread 完成後繼續執行

如果要判斷Thread執行完畢,才繼續執行程式,此時可以使用Join即可達到等待作用。

using System;
using System.Collections.Generic;
using System.Threading;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Thread> List_Thread = new List<Thread>();
            for (int i = 0; i < 10; i++)
            {
                //建立執行緒
                List_Thread.Add(new Thread((object x) =>
                {
                    int temp = 3;
                    while (temp-- > 0)
                    {
                        Console.WriteLine("Thread ID :" + x.ToString() + "\t" + temp.ToString());
                        System.Threading.Thread.Sleep(1000);
                    }
                }));
                List_Thread[i].Start(i + 1);
            }
            //等待所有執行緒完成
            foreach (Thread t in List_Thread) t.Join();
            Console.WriteLine("End");
        }
    }
}

  2011-11-30      ez      .NET
Thread 基本運用

基本的Thread寫法

using System;
using System.Threading;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread t = new Thread(new ThreadStart(ThreadFun));
            t.Start();
        }
        static void ThreadFun()
        {
            int x = 0;
            while (++x > 0) Console.WriteLine(x.ToString());
        }
    }
}

  2012-06-04      ez      .NET
ESC 終止 Console 及 Thread 運用

如果寫Console模式,就會發現只有一個Thread無法同時接收及輸出。

此時只要運用 Thread 達到 顯示 及 接收ESC!

原理就是多建立一個Thread執行程式用,另外一個監測ESC事件用。

using System;
using System.Threading;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            //產生Thread輸出數字1,2,3....
            Thread t = new Thread(() =>
            {
                int x = 0;
                while (++x > 0) Console.WriteLine(x.ToString());
            });
            t.Start();

            //當使用者按下ESC停止Thread
            while (Console.ReadKey(true).Key != ConsoleKey.Escape) ;
            t.Abort();
        }
    }
}

 


  2011-11-30      ez      .NET
將圖檔轉成 ICON

使用C#將圖片檔案轉為Icon檔案。

首先必須先準備16x16的小圖檔案,然後利用程式將他轉為Icon檔案。

//將圖檔設定給 bitmap 物件存放,並設定大小。 
Bitmap myBitmap = new Bitmap(Image.FromFile(filePath ), 16, 16);
IntPtr Hicon = myBitmap.GetHicon();
Icon newIcon = Icon.FromHandle(Hicon);
FileStream outStream = new FileStream(@"c:\a.ico", FileMode.OpenOrCreate);
newIcon.Save(outStream);
outStream.Flush();
outStream.Close();

  2011-11-29      ez      .NET
DNS 查詢 正反解

使用C#取得DNS的正反解,可以使用IP取得Domain或是Domain取得IP。

using System.Net;
using System.Net.Sockets;

namespace Test {
    class Program {
        static void Main(string[] args) {
            //取得主機名稱
            string HostName = "www.hinet.net";
            Console.WriteLine("{0} 所對應的 IP 位址如下 : ", HostName);
            IPHostEntry myAddress = Dns.GetHostEntry(HostName);
            IPAddress[] myIPAddress = myAddress.AddressList;
            foreach (IPAddress add in myIPAddress) Console.WriteLine(add);

            //取得IP位址
            string Address = "192.168.1.1";
            Console.WriteLine("{0} 所對應的 主機名稱 如下 : ", Address);
            IPHostEntry myHostName = Dns.GetHostEntry(Address);
            Console.WriteLine(myHostName.HostName.ToString());
        }
    }
}

  2011-11-30      ez      .NET
Path 組合路徑

如果有路徑需要組合,不需要透過字串組合,只要使用Path即可。

string PathStr = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "a.txt");
Console.WriteLine(PathStr);

  2011-11-29      ez      .NET
取得系統路徑
//目前程式目錄
string ApplicationBase = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
//Windows目錄
string winDir = System.Environment.GetEnvironmentVariable("windir");
//桌面目錄
string folder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);

 
// 系統特殊目錄
// Environment.SpecialFolder
Desktop: C:\Documents and Settings\Administrator\桌面
Programs: C:\Documents and Settings\Administrator\「開始」功能表\程式集
Personal: D:\My Documents
Favorites: C:\Documents and Settings\Administrator\Favorites
Startup: C:\Documents and Settings\Administrator\「開始」功能表\程式集\啟動
Recent: C:\Documents and Settings\Administrator\Recent
SendTo: C:\Documents and Settings\Administrator\SendTo
StartMenu: C:\Documents and Settings\Administrator\「開始」功能表
MyMusic: D:\My Documents\My Music
DesktopDirectory: C:\Documents and Settings\Administrator\桌面


  2011-11-30      ez      .NET
PING 網路是否正常

利用.Net 的 System.Net.NetworkInformation.Ping 測試網路是否正常!

System.Net.NetworkInformation.Ping NetPing = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply NetPingReply = NetPing.Send("168.95.1.1", 5000);

if(NetPingReply.Status == System.Net.NetworkInformation.IPStatus.Success)
{
     MessageBox.Show("OK");
}
else
{
     MessageBox.Show("ERROR");
}

  2011-11-29      ez      .NET