如果新值的字符串表示不区分大小写当前值,则ComboBox.ObjectCollection不会更新

时间:2012-03-22 22:54:19

标签: c# .net

如果我尝试更改ComboBox Items中的值,则只有在案例之后新值与当前值不同时才会更新不敏感的比较。

让我们用ComboBox制作一个项目:

ComboBox cboBox = new ComboBox();
cboBox.Items.Add("Apple");

以下代码将使ComboBox仍显示" Apple",即使字符串应该看起来不同:

cboBox.Items[0] = "APPLE";

我一直在使用的天真解决方法,这将使其正确显示:

cboBox.Items[0] = "";
cboBox.Items[0] = "APPLE";

我想知道这是怎么发生的,所以我用反射器挖了一下然后发现了这个。这是在您尝试修改值时调用的ComboBox.ObjectCollection.SetItemInternal方法:

internal void SetItemInternal(int index, object value)
{
    ...

    this.InnerList[index] = value;
    if (this.owner.IsHandleCreated)
    {
        bool flag = index == this.owner.SelectedIndex;
        if (string.Compare(this.owner.GetItemText(value), this.owner.NativeGetItemText(index), true, CultureInfo.CurrentCulture) != 0)
        {
            this.owner.NativeRemoveAt(index);
            this.owner.NativeInsert(index, value);
            if (flag)
            {
                this.owner.SelectedIndex = index;
                this.owner.UpdateText();
            }
            if (this.owner.AutoCompleteSource == AutoCompleteSource.ListItems)
            {
                this.owner.SetAutoComplete(false, false);
                return;
            }
        }
        else
        {
            if (flag)
            {
                this.owner.OnSelectedItemChanged(EventArgs.Empty);
                this.owner.OnSelectedIndexChanged(EventArgs.Empty);
            }
        }
    }
}

true中的string.Compare告诉它忽略字符串的大小写。为什么选择此方法来决定是否更新值?为什么他们没有揭露案例敏感性呢?

是否有替代方法来更新ObjectCollection中的项目,以便我不必猜测它是否真的得到更新?

编辑:我应该注意DropDownStyle设置为DropDownList:这是一个只读的ComboBox偶尔需要更新该计划中其他地方的行动。

2 个答案:

答案 0 :(得分:0)

试试这个,添加一个SelectedIndexChanged事件,并在其中放置:

int index = cboBox.SelectedIndex;
if (index - 1 >= 0) {
cboBox.SelectedIndex = index - 1;
cboBox.SelectedIndex = index;
}
else if (index + 1 < cboBox.InnerList.Count) {
cboBox.SelectedIndex = index + 1;
cboBox.SelectedIndex = index;
}

这可能与你的工作一样“天真”,但也许值得一试?

答案 1 :(得分:-1)

向MSDN提交报告后,它被标记为“按设计”,仅此而已,就是这样。