【问题标题】:selecting a item from a dictionary via a GUI通过 GUI 从字典中选择一个项目
【发布时间】:2009-06-30 14:14:34
【问题描述】:

我有这种情况:

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

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

OpenChatWindow(Int32 id, string name);

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

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

【问题讨论】:

    标签: c# winforms listbox


    【解决方案1】:

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

    重写 User 类的 ".ToString()" 方法,并使其输出 User 的名称,即

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

    然后您可以直接将您的用户对象添加到列表框中,添加后将显示用户的名称。如果它们是自动施放的,您可能必须将它们施放为我不是 100% 的对象...我会尽快回复您!

    然后在 ListBox 的 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);
              }
          }
    }
    

    【讨论】:

    • 在将用户添加到 ListBox 时,无需将用户转换为对象,在 .NET 中始终允许隐式向下转换为对象
    • 我有 99% 的把握帕特里克感谢您清理它!大声笑,如果您使用 AddRange 方法,我很确定您需要进行强制转换?
    • OP没有指定C#3.0,所以他可能需要声明“User user = myListBox.SelectedItem as User;”
    • 优雅的解决方案。我不是在字典中保存用户信息,而是在字典中保存了很多用户信息,在这样的类中。我不认为这种方法也允许我保存 id,但我想我可以将它添加到 userInfo 类中。
    • 我想我会扔掉那个 lstBox != null 检查,因为这只会保护你免受潜在的异常,但它仍然是一个错误的行为。如果您的 lstBox 在您期望它不是时为空,那么您有一个更大的问题。无论如何,+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);
    

    【讨论】:

    • 这是什么语法?它可以通过字符串检测成员??
    • 如果我更改用户字典,它不会更改列表框,对吧?那不是很好:\
    • 使用此语法列表框自动提取值,在 msdn 中阅读更多信息。什么根据字典,如果你不需要快速查找,那么你可以用List替换Dictionary并直接绑定到listBox。
    • 无论如何,如果您通过 Items 将项目添加到列表框。如果您从字典中添加或删除项目,添加列表保持不变。
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    相关资源
    最近更新 更多