【问题标题】:Right way to set selected text of combobox in winforms?在winforms中设置组合框选定文本的正确方法?
【发布时间】:2020-07-08 19:44:21
【问题描述】:

我有一个表单,它在它的构造函数中接收一个对象,并从该对象的属性中填充表单上的控件。我遇到了一个问题,我无法设置 ComboBox 的 SelectedText 属性,或者至少它没有按照我的预期工作。

public Form(ValueHoldingObject obj)
{
    // yeah I know this is not a very clean way to populate the combobox, the issue
    // isn't limited to the combobox so I don't think this is relevant
    List<int> items = Repo.GetAllItems().Reverse();
    foreach (int id in checkInPrizeIds.Take(100))
        // Insert at beginning to put more recently used items at the top
        combobox.Items.Insert(0, id);
    combobox.DropDownHeight = 200;

    combobox.SelectedText = obj.StringProperty;
}

当我测试这个表单时,组合框的文本没有被填充。如果我在我分配文本的行上添加一个断点,它确实被分配,所以一些事件正在触发(可能是多个焦点更改事件)并使其按我想要的方式工作。显然我不能在生产代码中使用断点作为修复。我是否错误地分配了这个值?我应该使用不同的方法来填充这些值吗?

进一步的测试表明它不仅仅是组合框,如果我有断点,我的所有控件都会正确填充。

【问题讨论】:

  • ComboBox.SelectedValue is null in the Form's constructor。您还可以将代码移到其他地方(处理创建句柄后生成的事件)。
  • @JacobHuckins 请创建一个新问题,而不是完全更改标题和内容,尤其是在获得原始问题的答案之后。
  • @OlivierRogier 我正在尝试删除它,但它不会让我因为你回答了它。我正在标记它,以便模组可以删除它。
  • @JacobHuckins 不要删除,答案可能对其他人有所帮助。请创建一个新的。如果需要,系统和版主可以在某一天删除它。
  • @OlivierRogier 不知道您可以回顾历史并像那样还原它。收回标志。

标签: c# winforms combobox


【解决方案1】:

在构造函数中,需要设置选中项,例如:

foreach ( var item in combobox.Items )
if ( (string)item == obj.StringProperty )
  combobox.SelectedItem = item;

或者:

foreach ( var item in combobox.Items )
  if ( (int)item == Convert.ToInt32(obj.StringProperty) )
      combobox.SelectedItem = item;

虽然名称令人困惑,但属性 SelectedText 并不是真正的选定项目...因为组合框项目是对象而不是字符串:显示的文本是使用 ToString() 的项目对象的表示。

因此设置选定的文本并不能保证选择一个项目,我们可以更喜欢设置SelectedItem

除了这些考虑之外,您在填充组合框后在构造函数中设置 selected 文本属性,这可能会导致问题,因为它是在绘制窗体和控件之前或类似的东西......也就是说可能在项目上调用 ToString() 方法以准备视觉缓存之前,因此设置选定的文本无法与列表匹配。

如果在表单加载或显示的事件中完成,则设置选定文本会选择现有项目。

private void Form_Load(object sender, EventArgs e)
{
  combobox.SelectedText = obj.StringProperty;
}

ComboBox.SelectedText doesn't give me the SelectedText

ComboBox.SelectedText Property

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多