如何在 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 发送例程没有了。
我编写了一个代码,使用 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 发送例程没有了。