none
請教各位前輩,希望做到 SerialPort.GetPortName 在 ComBox 元件排序顯示。 RRS feed

  • 問題

  • 請教各位前輩,

    小弟的程式碼如下,希望做到在 ComBox 元件排序顯示成:OFF、COM1、COM2、COM3、COM4、。。。

    private void Form1_Load(object sender, EventArgs e)  
    {  
      string[] strAryPorts = SerialPort.GetPortNames();  
      this.comboBox_Machine1.Items.Add("OFF");  
     
      foreach (string strPortNameTemp in strAryPorts)  
      {  
        this.comboBox_Machine1.Items.Add(strPortNameTemp);  
      }  

    原本是用 ArrayList 元件做排序,可是依然排的不適當,請問有什麼方法可以排的出來嗎?

    2009年2月2日 上午 07:58

解答

  •  啊,不好意思,我那範例是用 Visual Studio 2008(.NET Framework 3.5) 寫的,需要 using System.Linq 命名空間。

    我看到你的資料裡面還有 COM11 啊!那就用自訂排序方法吧。請試試這個(C# 2.0 語法):


        string[] strAryPorts = SerialPort.GetPortNames();  
        List<string> listPorts = new List<string>(strAryPorts);  
     
        Comparison<string> comparer = delegate (string name1, string name2)   
        {  
            int port1 = Convert.ToInt32(name1.Remove(0, 3));  
            int port2 = Convert.ToInt32(name2.Remove(0, 3));  
            return port1 - port2;  
        };  
     
        listPorts.Sort(comparer);  
     
        comboBox1.Items.AddRange(listPorts.ToArray()); 

    我用 VS2005 編譯過,應該沒問題了。

    若對其中的語法有疑問,可參考這篇:C# 筆記:重訪委派-從 C# 1.0 到 2.0 到 3.0

    http://huan-lin.blogspot.com/
    • 已編輯 Michael TsaiMVP 2009年2月3日 上午 06:55 補充說明
    • 已提議為解答 Lolota Lee 2009年2月3日 上午 06:57
    • 已標示為解答 Carlo Yang 2009年2月3日 上午 07:07
    2009年2月3日 上午 06:51

所有回覆

  • 試試這個: 


        private void Form1_Load(object sender, EventArgs e)  
        {  
            List<string> ports = SerialPort.GetPortNames().ToList();  
            ports.Sort();  
      
            this.comboBox_Machine1.Items.Add("OFF");  
      
            foreach (string strPortNameTemp in ports)  
            {  
                this.comboBox_Machine1.Items.Add(strPortNameTemp);  
            }   
        }  
     
     



    http://huan-lin.blogspot.com/
    2009年2月2日 下午 02:14
  • Dear Michael Tsai 前輩,

    SerialPort.GetPortNames().ToList(); 不能用...

    小弟改寫了一下,但是結果還是不如理想,變成 : COM1、COM10、COM11、COM2、COM3、COM4、...

    string[] strAryPorts = SerialPort.GetPortNames();  
    List<string> listPorts = new List<string>(strAryPorts.Length);  
    listPorts.AddRange(strAryPorts);  
    listPorts.Sort(); 

    謝謝前輩的建議。
    2009年2月3日 上午 05:10
  •  啊,不好意思,我那範例是用 Visual Studio 2008(.NET Framework 3.5) 寫的,需要 using System.Linq 命名空間。

    我看到你的資料裡面還有 COM11 啊!那就用自訂排序方法吧。請試試這個(C# 2.0 語法):


        string[] strAryPorts = SerialPort.GetPortNames();  
        List<string> listPorts = new List<string>(strAryPorts);  
     
        Comparison<string> comparer = delegate (string name1, string name2)   
        {  
            int port1 = Convert.ToInt32(name1.Remove(0, 3));  
            int port2 = Convert.ToInt32(name2.Remove(0, 3));  
            return port1 - port2;  
        };  
     
        listPorts.Sort(comparer);  
     
        comboBox1.Items.AddRange(listPorts.ToArray()); 

    我用 VS2005 編譯過,應該沒問題了。

    若對其中的語法有疑問,可參考這篇:C# 筆記:重訪委派-從 C# 1.0 到 2.0 到 3.0

    http://huan-lin.blogspot.com/
    • 已編輯 Michael TsaiMVP 2009年2月3日 上午 06:55 補充說明
    • 已提議為解答 Lolota Lee 2009年2月3日 上午 06:57
    • 已標示為解答 Carlo Yang 2009年2月3日 上午 07:07
    2009年2月3日 上午 06:51
  • Dear Michael Tsai 前輩,

    沒問題了,感謝前輩的指導!真的謝謝了。
    您的筆記簿真豐富,謝謝您的分享。
    2009年2月3日 上午 07:07