清除(删除)组合框项目会引发异常

时间:2016-03-12 20:05:07

标签: c# visual-studio silverlight combobox silverlight-5.0

我有一个组合框,单击按钮时会正确填充一些字段ID。

private void Button_Click(object sender, RoutedEventArgs e)
{         
    results.Items.Add(ID);          
}

现在我希望当我更改某个值以删除以前的值(或者我在组合框中有多个值时的值)但是我总是得到异常(如果在组合框中已经选择了某个值) 我尝试在顶部添加该方法:

results.Items.Clear();

我试过这个:

for (int i = 0; i < results.Items.Count; i++)
{
    results.Items.RemoveAt(i);
    i--;
}

但总是得到例外:

  

System.ArgumentException:值不在预期范围内。          在MS.Internal.XcpImports.MethodEx(IntPtr ptr,String name,CValue [] cvData)   在MS.Internal.XcpImports.MethodPack(IntPtr objectPtr,String methodName,Object [] rawData)   在MS.Internal.XcpImports.Collection_Add [T](PresentationFrameworkCollection'1集合,对象值)   在System.Windows.PresentationFrameworkCollection'1.AddImpl(Object value)   在System.Windows.Controls.ItemCollection.AddImpl(Object value)   在System.Windows.Controls.ItemCollection.AddInternal(Object value)   在System.Windows.PresentationFrameworkCollection'1.Add(T值)   在SXPCreateIncident3.SilverlightControl1.results_SelectionChanged(Object sender,SelectionChangedEventArgs e)   在System.Windows.Controls.Primitives.Selector.OnSelectionChanged(SelectionChangedEventArg

如果我没有Clear(Remove)这部分,那么每个按钮上的组合框都有更多元素点击但是我需要在点击按钮时清除之前的内容。

2 个答案:

答案 0 :(得分:2)

在删除之前,您是否尝试取消选择所有项目:

results.SelectedIndex = -1;
results.Items.Clear();

如果Clear仍然会造成一些麻烦,那么第二种方法不应该是:

for (int i = results.Items.Count - 1; i >= 0; i--)
{
    results.Items.RemoveAt(i);
}

答案 1 :(得分:0)

我不完全确定result.ItemsCombobox绑定的方式,但您可能会尝试用新的项目替换不需要的项目:

private void Button_Click(object sender, RoutedEventArgs e)
{
    // itemToRemove should already be set    
    var index = result.Items.IndexOf(itemToRemove);     
    results.Items[index ] = ID;          
}

要删除多个项目,请不要使用迭代器。使用迭代器时从集合中删除东西会使迭代器混乱。但是你可以这样做:

private void Button_Click(object sender, RoutedEventArgs e)
{
    for(var i = 0; i < result.Items.Count; i++)
    {
        // itemsToRemove should be populated with the IDs you want to remove.
        if(itemsToRemove.Contains(result.Items[i])
        {
            result.RemoveAt(i);
        }
    }
    result.Items.Add(ID);
}

这个循环不会搞砸,因为每次评估表达式i < result.Items.Count时,Count比删除ID时的Count少一个。< / p>

修改 要清除组合框并用新项目填充它,您必须为组合框提供新的ItemsSource

private void Button_Click(object sender, RoutedEventArgs e)
{
    results.ItemsSource = null;
    results.ItemsSource = new List<SomeType>(); // replace SomeType with the type of ID.
    results.Items.Add(ID);          
}