2015-07-21 23 views
0

我編寫了一個代碼,使用超鏈接點擊事件將命令發送到串行設備。由於越來越多的超鏈接不斷添加,我想簡化應用程序,方法是製作所有命令選項的下拉列表,以便在單擊某個特定選項時,事件將精確地沿着串行端口觸發該特定命令點擊鏈接時的操作方式。我不確定如何設置這個,所以如果我能看到一個例子,它將不勝感激。下面是我的代碼鏈接被點擊時的一個例子,我希望能夠做到這一點,但是從下拉列表中選擇。如何在C中使用組合框發送命令#

private void linkLabel_HC1_101_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
     { 
      if (serialPort1.IsOpen) 
      { 
       var content = new List<byte>(); 
       content.Add(2); 
       content.AddRange(Encoding.ASCII.GetBytes("01P00101##")); 
       content.Add(3); 
       byte[] buffer = content.ToArray(); 
       serialPort1.Write(buffer, 0, buffer.Length); 
      } 
     } 

     private void HC2_101_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) 
     { 
      if (serialPort1.IsOpen) 
      { 
       var content = new List<byte>(); 
       content.Add(2); 
       content.AddRange(Encoding.ASCII.GetBytes("02P00101##")); 
       content.Add(3); 
       byte[] buffer = content.ToArray(); 
       serialPort1.Write(buffer, 0, buffer.Length); 
      } 
     } 

回答

0

在你的ComboBox中,你可能想要顯示一個用戶友好的文本,而不是你想發送的字節。用兩個字符串屬性創建一個類:

public class Command 
{ 
    public string DisplayText { get; set; } 
    public string CommandText { get; set; } 

    public Send(SerialPort serialPort) 
    { 
     if (serialPort.IsOpen) { 
      var content = new List<byte>(); 
      content.Add(2); 
      content.AddRange(Encoding.ASCII.GetBytes(CommandText)); 
      content.Add(3); 
      byte[] buffer = content.ToArray(); 
      serialPort.Write(buffer, 0, buffer.Length); 
     } 
    } 

    public override string ToString() 
    { 
     return DisplayText; 
    } 
} 

重寫ToString是很重要的。這使組合框可以正確顯示項目。

現在你可以將這些命令添加到組合框:

comboBox1.Add(new Command { DisplayText = "HC1 101", CommandText = "01P00101##" }); 
comboBox1.Add(new Command { DisplayText = "HC2 101", CommandText = "02P00101##" }); 

在組合框中事件......

void ComboBox1_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
    var command = (Command)comboBox1.SelectedItem; 
    if (command != null) { 
     command.Send(serialPort1); 
    ) 
} 

您還可以使用「發送」按鈕來代替。這使您可以重複發送相同的命令,而無需在組合框中重新選擇它。

如果前導字節和尾隨字節對於不同的命令是不同的,則也可以將它們包括爲屬性。

這種方法的一個很好的效果是,您將傳輸邏輯放在單獨的類中,而不是在Form中,並且不必複製/粘貼發送例程。

0

如果您想簡單地使用靜態字符串值創建下拉列表。如果字符串是你發送的字符串,那麼它就非常容易。 比方說,你的下拉稱爲listbox

content.AddRange(Encoding.ASCII.GetBytes(this.listbox.Text)); 

否則,如果你想要的文字是不同的東西,你可以做的下拉文本的開關。

string bytesToGet = string.empty; 
switch (listbox.Text){ 
    case "H01": 
     bytesToGet = "01P00101##"; 
    case "H02": 
     bytesToGet = "02P00101##"; 
} 
content.AddRange(Encoding.ASCII.GetBytes(bytesToGet)); 

您還可以執行與列表框上的文本配對的值的下拉菜單。你可以,如果你想在設計靜態創建這個配對,然後使用該值來保存該字符串到要添加爲這樣

content.AddRange(Encoding.ASCII.GetBytes(listbox.SelectedItem.Value)); 
0

一系列你可以使用ComboBox的SelectedIndexChange事件

例如

private void InitComboBox() 
{ 
    comboBox1.Items.Add("Command1"); 
    comboBox1.Items.Add("Command2"); 
    comboBox1.Items.Add("Command3"); 
    comboBox1.Items.Add("Command4"); 
    comboBox1.Items.Add("Command5"); 
} 

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (comboBox1.SelectedItem.ToString().Equals("Command1")) 
    { 
    //Excute Command here 
    } 
    //... 
}