在下面显示的代码注释中突出显示以下错误需要帮助 以下方法的目的是通过值找到一个combox项目,如果存在则将其设置为组合框,否则将其添加到组合框然后进行设置。
private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)
{
bool isValueNotFound = false;
cb.SelectedValue = valuetoSet;
isValueNotFound = string.IsNullOrEmpty(Convert.ToString(cb.SelectedValue));
if (isValueNotFound)
{
//try to ignore case and find the item in combobox
foreach (ComboBoxItem item in cb.Items) //1.ERROR AFTER ANY ITEM ADDED using my code
{
if (string.Compare(Convert.ToString(item.Content), valuetoSet, true) == 0)
{
cb.SelectedValue = item.Content;
isValueNotFound = false;
}
}
//if still not found add the item to the combobox
if (isValueNotFound)
{
cb.Items.Add(valuetoSet);
cb.SelectedValue = valuetoSet;//2.THIS IS NOT WORKING
}
}
}
我使用的样品组合框
<ComboBox Grid.Column="5" Grid.Row="4" Margin="10" Name="cbbox1" SelectedValuePath="Content">
<ComboBoxItem Content="No" IsSelected="True" />
<ComboBoxItem Content="Yes" />
</ComboBox>
请告诉我 a)我如何解决这条非工作线。 b)我在评论中显示的行中收到错误。我该如何防止它。
答案 0 :(得分:1)
这里的问题是你要在ComboBox的项目中添加一个字符串:
cb.Items.Add(valuetoSet);
您应该添加一个新的ComboBoxItem:
cb.Items.Add(new ComboBoxItem { Content = valuetoSet });
否则,您将在Items集合中混合ComboBoxItems和字符串。现在,当您将项目作为ComboBoxItems进行迭代时,遇到添加的字符串项时会出现异常。
但是,您应该考虑使用字符串项而不是ComboBoxItems。这样可以使您的代码更清晰,您可以直接通过SelectedItem属性处理所选字符串项,而无需SelectedValuePath
和Convert.ToString(item.Content)
之类的内容。
您甚至可以在XAML中定义初始项目字符串,如下所示:
<ComboBox xmlns:sys="clr-namespace:System;assembly=mscorlib"
SelectedIndex="0" ...>
<sys:String>No</sys:String>
<sys:String>Yes</sys:String>
</ComboBox>
现在你的整个SetComboBoxValueHelper方法会像Novitchi所写的那样简化:
private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)
{
if (!cb.Items.Contains(valuetoSet))
{
cb.Items.Add(valuetoSet);
}
cb.SelectedItem = valuetoSet;
}
编辑:如果仍然需要迭代项目,你也会迭代字符串而不是ComboBoxItems:
foreach (string item in cb.Items)
{
...
}
答案 1 :(得分:0)
正如Clemens已经建议你不要混合使用ComboBoxItems和String。从XAML中,您可以从添加字符串的代码中添加到combobox ComboBoxItems。一个简单的解决方案是将所有Items设置为字符串。为此,您应该从代码中添加Yes,No items。 然后你的SetComboBoxValueHelper应如下所示:
private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)
{
bool valueNotFound = !cb.Items.Contains(valuetoSet);
if (valueNotFound)
cb.Items.Add(valuetoSet);
cb.SelectedItem = valuetoSet;
}
wpf将为您创建ComboBoxItem,您可以使用
获取它 cb.ItemContainerGenerator.ContainerFromItem("ItemString");