通过GUI从字典中选择项目

时间:2009-06-30 14:14:35

标签: c# winforms listbox

我遇到这种情况:

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

其中Int32是用户标识,userInfo包含名称和其他详细信息。 我想在表单中显示一个名单列表,并允许使用该程序的人双击一个以打开一个窗口(类似于MSN messenger中发生的情况)。当双击用户的名字时,我需要知道id,所以我可以做

OpenChatWindow(Int32 id, string name);

我真的不知道怎么做,我正在使用winforms。我想到了ListBox,但又一次,我不确定如何。我该怎么办?

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

2 个答案:

答案 0 :(得分:6)

我不会选择将用户信息存储在字典对象中。我将创建一个名为User的类,并在类中存储所有信息,包括id。

覆盖User类的“.ToString()”方法,并使其输出User的名称,即

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

然后,您可以直接将“用户”对象添加到“列表”框中,添加后,将显示用户名。你可能不得不把它们作为对象投射我不是100%如果它们是自动投射的......我会回复你的!

然后在ListBox的SelectedIndexChanged事件上,你可以简单地执行:

var user = myListBox.SelectedItem as User;

将返回User对象供您查找:

OpenChatWindow(user.ID, user.Name);

因此,如果你有一个控制器类,你可以将它连接到List框的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 :(得分:2)

以这种方式更改userInfo类,因此它将包含userId(如果它现在没有它)。然后你可以将字典数据绑定到列表框:

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

然后您可以简单地将SelectedItem属性转换为userInfo类:

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