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

本文关键字:组合 命令 | 更新日期: 2023-09-27 18:03:44

我编写了一个代码,使用超链接单击事件向串行设备发送命令。由于我不断添加的超链接越来越多,因此我希望通过制作所有命令选项的下拉列表来简化应用程序,以便在单击特定的命令选项时,一个事件向串行端口触发该特定命令,就像单击链接时一样。我不知道如何设置这个,所以如果我能看到一个例子,它会很感激。下面是我的代码的一个例子,当链接被点击,我希望能够做到这一点,但之后从下拉列表选择而不是。

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

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

在您的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中,你不必再复制/粘贴send例程。

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

如果你想简单点,创建静态字符串值的下拉列表。如果字符串是你要发送的,那就非常简单了。假设你的下拉菜单名为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));