如何在 C# 中使用组合框发送命令

How to send command using combobox in C#

我编写了一个代码,使用 hyperlink 单击事件向串行设备发送命令。因为我不断添加的 hyperlink 越来越多,所以我想通过制作所有命令选项的下拉列表来简化应用程序,以便在单击特定命令选项时触发特定事件当单击 link 时,命令串行端口完全正确。我不确定如何设置它,所以如果我能看到一个例子,我将不胜感激。下面是单击 link 时我的代码示例,我希望能够执行此操作,但是在从下拉列表中进行选择之后。

 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);
            }
        }

如果您想简单一点,请使用静态字符串值创建下拉列表。如果字符串是您发送的字符串,那么它会变得非常容易。 假设您的下拉菜单名为 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));

您可以使用 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
  }
  //...
}

在您的 ComboBox 中,您可能希望显示用户友好的文本,而不是要发送的字节。使用两个字符串属性创建 class:

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);
    )
}

您也可以改用 "send" 按钮。这使您可以重复发送相同的命令,而不必在组合框中重新select它。

如果不同命令的前导字节和尾随字节不同,您也可以将它们作为属性包含在内。

这种方法的一个很好的效果是,您将传输逻辑放在一个单独的 class 中,而不是将其放在表单中,并且您不必 copy/paste 发送例程没有了。