Reputation: 16814
Need help on below errors highlighted in the code comments shown below The purpose of the below method is to find an combox item byvalue and set it to combobox if present else add it to combobox and then set it.
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
}
}
}
A sample combobox i use is
<ComboBox Grid.Column="5" Grid.Row="4" Margin="10" Name="cbbox1" SelectedValuePath="Content">
<ComboBoxItem Content="No" IsSelected="True" />
<ComboBoxItem Content="Yes" />
</ComboBox>
Please let me know a)how i can fix that non working line. b)I get error at line shown in comment. how do i prevent it.
Upvotes: 0
Views: 2098
Reputation: 128013
The problem here is that you are adding a string to the ComboBox's Items:
cb.Items.Add(valuetoSet);
You should instead add a new ComboBoxItem:
cb.Items.Add(new ComboBoxItem { Content = valuetoSet });
Otherwise you mix ComboBoxItems and strings in the Items collection. Now when you iterate over the items as ComboBoxItems, you get an exception when the added string item is encountered.
You should however consider to use string items instead of ComboBoxItems. That would make your code cleaner and you could address the selected string item directly by the SelectedItem property, without any need for SelectedValuePath
and stuff like Convert.ToString(item.Content)
.
You could even define the initial item strings in XAML like this:
<ComboBox xmlns:sys="clr-namespace:System;assembly=mscorlib"
SelectedIndex="0" ...>
<sys:String>No</sys:String>
<sys:String>Yes</sys:String>
</ComboBox>
Now your whole SetComboBoxValueHelper method would simplify as Novitchi has written:
private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)
{
if (!cb.Items.Contains(valuetoSet))
{
cb.Items.Add(valuetoSet);
}
cb.SelectedItem = valuetoSet;
}
EDIT: If there is still any need to iterate over the items, you would also iterate over strings instead of ComboBoxItems:
foreach (string item in cb.Items)
{
...
}
Upvotes: 1
Reputation: 3741
As Clemens already suggested you shouldn't mix the ComboBoxItems and String. From XAML you adding to combobox ComboBoxItems, from code you adding Strings. A simple solution will be to set all Items as string. For this you should add your Yes, No items from code too. Then your SetComboBoxValueHelper should look like this:
private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)
{
bool valueNotFound = !cb.Items.Contains(valuetoSet);
if (valueNotFound)
cb.Items.Add(valuetoSet);
cb.SelectedItem = valuetoSet;
}
The wpf will create the ComboBoxItem for you and you can get it using
cb.ItemContainerGenerator.ContainerFromItem("ItemString");
Upvotes: 0