【问题标题】:Clear(remove) combobox items throws exception清除(删除)组合框项目引发异常
【发布时间】:2016-03-13 07:26:12
【问题描述】:

我有组合框,当单击按钮时,该组合框正确填充了一些字段 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,字符串名称,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(对象值) 在 System.Windows.Controls.ItemCollection.AddImpl(对象值) 在 System.Windows.Controls.ItemCollection.AddInternal(对象值) 在 System.Windows.PresentationFrameworkCollection'1.Add(T 值) 在 SXPCreateIncident3.SilverlightControl1.results_SelectionChanged(对象发送者,SelectionChangedEventArgs e) 在 System.Windows.Controls.Primitives.Selector.OnSelectionChanged(SelectionChangedEventArg

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

【问题讨论】:

  • 注意:您不应该在 for 循环中修改迭代器计数器(除非您知道自己在做什么)...
  • 嗨,好的,但是如果我已经在 Combobox 中选择了某些项目,为什么 Clear 方法不起作用?

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    我不完全确定 result.Items 是如何与您绑定的 Combobox 但您可以尝试将不需要的项目替换为新项目:

    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 &lt; result.Items.Count 被计算并且当 ID 被移除时,Count 比之前的 Count 小一。

    编辑 要清除组合框并用新项目填充它,您必须为组合框提供一个新的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);          
    }
    

    【讨论】:

    • 嗨 Venerik,谢谢,但 itemsToRemove 是什么?我想全部删除。然后我应该如何设置这个 itemsToRemove?
    • 你写了“现在我想当我改变一些值来删除以前的值(或者如果我在组合框中有多个值的情况下的值)”。因此,我假设您以某种方式跟踪要删除的值。这就是您应该在itemsToRemove 中输入的值。
    • 您好 venerik 我想删除组合框中的所有值,以防我在组合框中选择了一些值,因为我希望单击按钮以从头开始再次填充组合框。 itemsToRemove 是我应该填充的某种 ListBox 吗?或者你能在我从组合框中删除所有内容之前帮助我如何填充它吗?
    • 您好,同样的问题很遗憾:值不在预期范围内。第一个值已正确填充,但如果我选择它并再次单击它会立即引发错误的按钮。 ID 是我在字段 ID 中作为字符串检索的值。结果.ItemsSource = null; results.ItemsSource = new List(); results.Items.Add(ticketID);
    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 2011-03-01
    相关资源
    最近更新 更多