使用“名称”和“值”填充组合框

本文关键字:组合 填充 名称 使用 | 更新日期: 2023-09-27 17:56:37

我有一个combobox列出了一些单字节cmd,可以发送到我开发的一些自定义硬件。 使用下面的 C# 代码,用户当前只能按名称从cbCANcmd中选择命令。 我还找到了仅显示值的方法,但更喜欢同时显示名称和数字。

  1. 如何在 cb 下拉列表中同时显示十六进制值和cmd值? 0d - CommsSoftReset
  2. 并且仍然能够为未列出的命令键入un-enumerated值,例如 05
  3. 我是否可以轻松隐藏更危险的物品(即 09-WipeAllFlash ),但仍然按照上面的 #2 以数字方式输入它们?

注意:枚举来自直接的 C 语言 .h 文件,标头每天更改的次数比 c# 应用多。 出于这个原因,我希望避免为每个值添加[Description()],或大幅更改格式,因为随着我们继续开发,它将不得不多次复制和重做)

附言我通常只用简单的 C 编写,用于接收这些命令的 8 位微。由于这是我的第一个 c# 测试应用程序,请温和:)

enum COMMS_MESSAGE_ID_t : byte  
{  
    CommsRAMRead = 0x00,
    CommsRAMWrite = 0x01,
    CommsCommitRAMbufferToFlash = 0x02,                 
    CommsWipeAllFlash = 0x0c,
    CommsSoftReset = 0x0d,
    CommsGetVersion = 0xff
}
private void SendTab_Enter(object sender, EventArgs e)
{
    //need to populate the pulldowns with the available commands
    cbCANcmd.DataSource = Enum.GetValues(typeof(COMMS_MESSAGE_ID_t)); 
}
private void SendDownlinkCmd_Click(object sender, EventArgs e)
{
    // send the command selected in the send tab's combobox
    byte CANcmd = (byte)(COMMS_MESSAGE_ID_t)cbCANcmd.SelectedValue;//first byte           
}

使用“名称”和“值”填充组合框

如果这是一个 WinForms 应用程序,下面是 #1 的可能解决方案。如果这行得通,我们可以从那里继续前进。

public partial class Form1 : Form
{
    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (var val in Enum.GetNames(typeof(COMMS_MESSAGE_ID_t)))
        {
            cbCANcmd.Items.Add(new CommsMessage(val));
        }
    }
}
public class CommsMessage
{
    public string Name { get; set; }
    public COMMS_MESSAGE_ID_t Message { get; set; }
    public CommsMessage(string msgName)
    {
        Name = msgName;
        Message = (COMMS_MESSAGE_ID_t)Enum.Parse(typeof (COMMS_MESSAGE_ID_t), msgName);
    }
    public override string ToString()
    {
        return string.Format("{0:x} - {1}", Message, Name);
    }
}

然后,每当获取 ComboBox.SelectedItem 的值时,都可以执行以下操作:

COMMS_MESSAGE_ID_t msg = (cbCANcmd.SelectedItem as CommsMessage).Message;

我省略了很多您可能应该做的异常处理,但我希望这会有所帮助。