【问题标题】:refresh combobox and reselect the last item in C#刷新组合框并重新选择 C# 中的最后一项
【发布时间】:2016-01-30 13:18:27
【问题描述】:

我创建了一个包含字符串 (comboBox.Items.Add(string)) 的组合框,每隔几秒钟我想刷新一次它(它是一个客户端列表,因此有些人可能会连接/断开连接)。我遇到的问题是,当我刷新列表时,它也会将所选项目更改为 null ,因此如果我尝试与最后一个选定的客户端通信会导致问题(这意味着我必须在之后重新选择他每个滴答声) 我的刷新代码是:

prog.comboBox1.Items.Clear();
foreach (string client in data.Split('#'))
{
      prog.comboBox1.Items.Add(client);
}

刷新后我尝试重新选择项目的代码(它不起作用)是:

string previous = prog.comboBox1.GetItemText(prog.comboBox1.SelectedItem);
//Refresh list here (With the code above)
if (prog.comboBox1.Items.Contains(previous))
       prog.comboBox1.Text = previous;

有什么办法可以做我想做的事吗?

【问题讨论】:

  • 你怎么刷新?这是网络应用程序吗?
  • 尝试吹散 SelectedItem 并将其放回原处。如果您设置 Text 您会覆盖(随机)当前项目的文本...
  • 但如果是这样,我将不得不将上一项保存为对象,并且无法使用 Contains 属性。
  • 客户有ID吗?使用唯一 ID 作为参考会容易得多。
  • 使用 BindingList<T> 并将其设置为 ComboBox.DataSource 而不是使用此 BindingList 而不是直接清除组合框项目列表。

标签: c# list combobox refresh items


【解决方案1】:

我不确定这是否是一个好的界面。操作员正在选择某物,当他按下鼠标按钮单击某物时,列表发生了变化。您确定这不会导致选择了错误的项目吗?

将此与在文件资源管理器中选择要删除的文件进行比较。您选择了要删除的文件,而另一个进程更改了文件夹的内容,从而导致选择了错误的文件。

如果在鼠标单击期间选定的项目不再有效,会选择什么?如果用户点击,将视线转移到 OK 按钮,却没有看到他选择了错误的项目怎么办?您是否考虑过如果操作员使用键盘和箭头键选择组合框中的项目会发生什么?

如果您在选择时而不是在选择后并按下 OK 按钮后执行操作,则此用户界面尤其危险。

如果您查看其他在选择过程中可能会发生变化的常见 Windows 应用程序,您总是会看到以下情况:

  • 当可以选择的项目集合变得可见时,系统确定集合
  • 虽然此集合可见,但集合不会更改
  • 选择集合中的项目不会执行操作
  • 只有在操作员按下确定(或继续/下一个/任何)后,才会检查选择的有效性。

如果您添加确认按钮并使用以下场景,那么您将不会遇到问题:

  • 在组合框下拉列表的打开事件中,您添加当前存在的项目
  • 操作员选择项目,也可能选择其他事物
  • 在确认选择后,您检查所有选择的项目是否仍然有效并继续或通过错误提供程序或消息框显示一些错误。

所以我建议你重新考虑你的用户界面,添加一个确认按钮,运营商会感谢你的。

【讨论】:

    【解决方案2】:

    类似的东西:

    // to prevent re-drawing
    prog.comboBox1.BeginUpdate();
    
    try {
      // swicth event processing off: 
      // do not pay attention to selected index changing while refresing the combo
      prog.comboBox1.SelectedIndexChanged -= prog.comboBox1_SelectedIndexChanged;
    
      try {
        prog.comboBox1.Items.Clear();
        // You don't want the foreach loop...
        prog.comboBox1.Items.AddRange(data.Split('#'));
      }
      finally {
        // swicth event processing back on
        prog.comboBox1.SelectedIndexChanged += prog.comboBox1_SelectedIndexChanged;
      }
    
      // Finally, select the item
      prog.comboBox1.Items.SelectedIndex = ... 
    }
    finally {
      prog.comboBox1.EndUpdate();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-09
      • 2013-03-24
      • 2015-02-13
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多