2014-04-04 45 views
1

我有一個combobox列出了一些可以發送到我開發的一些自定義硬件的單字節cmds。使用下面的C#代碼,用戶當前可以僅按名稱從cbCANcmd中選擇命令。我還找到了只顯示數值的方法,但更喜歡顯示名稱和數字。使用名稱和值填充組合框,

  1. 如何在cb下拉菜單中顯示十六進制值& cmd?例如0d - CommsSoftReset
  2. 對於未列出的命令,仍然能夠輸入un-enumerated的值,例如05
  3. 我可以很容易地隱藏更多危險物品(即09-WipeAllFlash),但仍然按照上述#2的數字輸入它們嗎?

注意:enum來自一個直接的C語言.h文件,並且標題每天更改的次數多於c#應用程序。出於這個原因,我希望避免爲每個值添加[Description()],或者大幅改變格式,因爲在我們繼續開發時它將不得不被複制和重做多次)

P.S.我通常只寫簡單的C,對8位微接收這些commands..As這是在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   
} 

回答

1

如果這是一個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; 

我省略了大量的異常處理,你可能應該做的,但我希望這是有幫助的。

+0

This Works。謝謝!我不得不將'公開部分Form1Load'中的代碼移動到我的'私人Form1Load',但不知道爲什麼。讓我開始,雖然我的代表允許,並會upvote。 – user3496191

+0

酷!很高興它對你有效!如果要處理#2(不在枚舉中的值),只需向CommsMessage中添加一個構造函數,該構造函數接受一個字節(以及可選的字符串,用於名稱)。對於#3,最簡單的方法是保存一個「危險」命令列表,並在向ComboBox添加項時將其過濾掉。就個人而言,我會從app.config或Settings中管理這些「危險命令」,因此您可以添加或刪除它們而無需重新編譯。 – t3sture