2017-04-06 36 views
0

我在顯示可用串行端口的不同TabPages上有一些組合框。我可以在組合框中選擇一個端口並連接到它以獲取數據。現在我想讓comboBoxes隱藏已經在使用的端口。什麼是最好的方式來做到這一點?僅當串口沒有被使用時纔將串口添加到comboBox! C#

這裏是一個組合框的下拉會發生什麼:

string[] portNames = SerialPort.GetPortNames(); 
    comboBox9.Items.Clear(); 
    foreach (var portName in portNames) 
    { 
     //checks if combox already contains same Item. 
     if (!comboBox9.Items.Contains(portNames)) 
     { 
      comboBox9.Items.Add(portName); 
     } 
    } 




    private void button1_Click(object sender, EventArgs e) 
    { 
     //<-- This block ensures that no exceptions happen 
     if (_serialPort1 != null && _serialPort1.IsOpen) 
      _serialPort1.Close(); 
     if (_serialPort1 != null) 
      _serialPort1.Dispose(); 
     //<-- End of Block 

     if (comboBox2.Text != "") 
     { 
      _serialPort1 = new SerialPort(comboBox2.Text, BaudRate, Parity.Even, 7, StopBits.Two);  //<-- Creates new SerialPort using the name selected in the combobox 
      _serialPort1.DataReceived += SerialPortOnDataReceived;  //<-- this event happens everytime when new data is received by the ComPort 

      _serialPort1.Open();  //<-- make the comport listen 

      button1.Enabled = false; 
      button2.Enabled = true; 
+0

您正在創建組合框的所有項目前的for循環。這會將所有端口添加到組合框。 'SerialPort.GetPortNames()'返回所有的端口(空閒端口和使用端口)? –

+0

是的,它會同時返回免費和正在使用的這些。 –

+0

那麼你如何決定哪一個是免費的,哪一個正在使用? –

回答

1

變化button_click事件如下。

private void button1_Click(object sender, EventArgs e) 
{ 
    //<-- This block ensures that no exceptions happen 
    if (_serialPort1 != null && _serialPort1.IsOpen) 
     _serialPort1.Close(); 
    if (_serialPort1 != null) 
     _serialPort1.Dispose(); 
    //<-- End of Block 
    // Adding port back to the comboBox as it is not open now. 
    comboBox.Items.Add(_serialPort1.PortName); 

    if (comboBox2.Text != "") 
    { 
     _serialPort1 = new SerialPort(comboBox2.Text, BaudRate, Parity.Even, 7, StopBits.Two);  //<-- Creates new SerialPort using the name selected in the combobox 
     _serialPort1.DataReceived += SerialPortOnDataReceived;  //<-- this event happens everytime when new data is received by the ComPort 

     _serialPort1.Open();  //<-- make the comport listen 

     //removing port from the comboBox as it is now open and in-use. 
     comboBox2.Items.Remove(comboBox2.Text); 
     button1.Enabled = false; 
     button2.Enabled = true; 
} 

這應該可以解決您的問題。

+0

謝謝!這幫助了我! 我需要這個'comboBox.Items.Add(_serialPort1.PortName)' –

+0

但它只適用於我刪除comboBox下拉事件...所以顯示在comboBoxes中的連續端口不是最新的。我如何檢查一個端口是否打開,並且該端口不需要添加到組合框?或者我需要在Drop Down事件中進行更改? 我已經試過了:'if(_serialPort2.PortName!= portName&_serialPort3.PortName!= portName&_serialPort4.PortName!= portName&_serialPort5.PortName!= portName&!comboBox9.Items.Contains(portName)) { comboBox9 .Items.Add(PORTNAME); }' –

+0

你可以把你的代碼放在問題中嗎?還可以分享一些關於代碼的更多細節,例如何時執行Form_Load,button_Click?如果你可以在代碼和業務用例中加入一些上下文,那會更好。分享更多可以解釋整個場景的代碼也會有所幫助。 –