如果我尝试更改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
偶尔需要更新该计划中其他地方的行动。
答案 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提交报告后,它被标记为“按设计”,仅此而已,就是这样。