同时删除列表框中的2个项目

时间:2014-07-23 08:20:47

标签: c# winforms listbox

我要同时从列表框中删除2个项目,第一个项目是信息项目,而secong项目只是在它们之间创建空间。

这是包含以下项目的列表框:

Listbox

我想在其后删除世界项目和空白项目

我已尝试过此代码:

listbox1.Items.Remove(listbox1.SelectedItem);
listbox1.Items.RemoveAt(listbox1.SelectedIndex + 1);
问题是它从列表框中删除了所有项目或删除了不同的项目。

将项目添加到列表框我使用Insert

listbox1.Items.Insert(0, "");
listbox1.Items.Insert(0, "!");
listbox1.Items.Insert(0, "");
listbox1.Items.Insert(0, "World");
listbox1.Items.Insert(0, "");
listbox1.Items.Insert(0, "Hello");

4 个答案:

答案 0 :(得分:2)

当您致电listbox1.Items.Remove(listbox1.SelectedItem);时,您将删除当前所选的项目。这意味着listbox1.SelectedItemlistbox1.SelectedIndex不再指向他们之前所做的事情。

撤销通话顺序是避免这种情况的一种方法。

listbox1.Items.RemoveAt(listbox1.SelectedIndex + 1);
listbox1.Items.Remove(listbox1.SelectedItem);

答案 1 :(得分:1)

这样做

listbox1.Items.RemoveAt(listbox1.SelectedIndex + 1);//deletes the item below World
listbox1.Items.Remove(listbox1.SelectedItem);//deletes World

答案 2 :(得分:0)

如果将集合绑定到ObservableCollection,则不必处理这些问题。

视图模型:

private ObservableCollection<String> items;
private String selectedItem;

public ObservableCollection<String> Items 
{
    get { return items; }
    set {
       if( items==value )// simplified
           return;
        items = value;
        RaisePropertyChanged("Items");
    }
}

public String SelectedItem {...}

查看:

<...
    <ListBox ItemsSource={Binding Items, Mode=TwoWay} SelectedItem={Binding SelectedItem, Mode=TwoWay}>
        <ListBox.TemplateStuffGoesHere/>
.../>

在实现INotifyPropertyChanged接口的viewmodel中执行此操作,或者forinstance使用galasofts mvvmlight viewmodelbase类作为基类。当您只是从列表中删除项目时,删除项目现在应该自动工作。直接使用令人讨厌的代码隐藏的控件直接混乱是一个很大的禁忌=)

答案 3 :(得分:0)

根据您尝试的代码,

listbox1.Items.Remove(listbox1.SelectedItem);
listbox1.Items.RemoveAt(listbox1.SelectedIndex + 1);

之后

listbox1.Items.Remove(listbox1.SelectedItem); 

删除所选项目,所选项目背后的项目减少其指数 1 (向前移动)。除此之外,listbox1.SelectedIndex之后也变为 -1 。那一刻,

listbox1.SelectedIndex + 1 = -1 + 1 = 0

因此,你正在做

listbox1.Items.RemoveAt(0);

这就是为什么你觉得很奇怪,因为你删除了你选择的项目新列表框列表的第一项(所选项目后面的那些项目向前移动)。

在您的情况下,删除“世界”,然后删除“Hello”。


我建议你存储SelectedIndex的值并重用它。

    int i = listbox1.SelectedIndex;
    listbox1.Items.RemoveAt(i);
    listbox1.Items.RemoveAt(i);

要删除包含所选项目的 n 连续行

    int i = listbox1.SelectedIndex;
    for (int j = 0; j < n;j++ )
        listbox1.Items.RemoveAt(i);

全部因为删除项目后所有项目索引都会更新。