2009-06-30 51 views
0

選擇從字典中的項目我有這樣的情況:通過GUI

Dictionary<Int32, userInfo> users = new Dictionary<Int32, userInfo>(); 

凡的Int32是用戶ID和用戶信息包含名稱和其他細節。 我想在窗體中顯示一個名稱列表,並允許使用該程序的人雙擊一個來打開窗口(類似於MSN Messenger中發生的情況)。當用戶的名字被雙擊我需要知道的ID,所以我可以做

OpenChatWindow(Int32 id, string name); 

我真的不知道該怎麼做,我使用的WinForms。我想到了ListBox,但是,我不知道如何。我該怎麼辦?

PS。 userInfo.name在Dictionary中是唯一的,但我真的不想開始尋找它。

回答

6

我不會選擇將用戶信息存儲在字典對象中。我會創建一個名爲User的類,並將所有信息(包括id)存儲在該類中。

覆蓋「的ToString()」 User類的方法,並使其輸出的用戶的名稱,而不是即

protected override string ToString() 
{ 
    return this.Name; 
} 

然後你就可以直接加入您的用戶對象列表框,當他們被添加的用戶的名字將被顯示。您可能必須將它們作爲對象進行投射,如果它們自動投射,我不是100%......我會盡快回復您!

然後在列表框的SelectedIndexChanged事件,你可以簡單地做:

var user = myListBox.SelectedItem as User; 

將返回用戶對象供你使用你查找:

OpenChatWindow(user.ID, user.Name); 

所以,如果你有一個控制器類,您可以將它連接到列表框的SelectedIndexChanged事件,然後處理它是您想要執行的操作:

public void OnUserSelected(object sender, EventArgs e) 
{ 
     var lstBox = sender as ListBox; 
     if (lstBox != null) 
     { 
      if (lstBox.SelectedItem is User) 
      { 
       var user = lstBox.SelectedItem as User; 
       OpenChatWindow(user.ID, user.Name); 
      } 
     } 
} 
+1

沒有必要將它們添加到列表框時投下的用戶爲對象,在.NET中始終允許隱式向下對象向下轉換 – 2009-06-30 14:26:08

+0

我大約有99%的人確信Patrick感謝您清除它!大聲笑我敢肯定,如果你使用AddRange方法,你需要做一個投射壽命? – James 2009-06-30 14:28:04

2

以這種方式更改userInfo類,以便它包含userId(如果它現在沒有)。然後你就可以進行數據綁定字典到列表框中:

listBox.DisplayMember = "Name"; 
listBox.ValueMember = "userId"; 
listBox.DataSource = new List<UserInfoClass>(users.Values); 

那麼你可以得到簡單的投SelectedItem屬性您的用戶信息類:

UserInfoClass userInfo = (UserInfoClass)listBox.SelectedItem; 
OpenChatWindow(userInfo.userId, userInfo.Name);