如何删除列表框中选定的表中的多行

本文关键字:何删除 删除 列表 | 更新日期: 2023-09-27 18:14:08

我有一个表,它的内容显示在listbox。我想删除用户选择的行。如何知道要删除哪些行以及如何删除?

下面是我显示列表框项的方式:

DataSet AllPairs = new DataSet();
AllPairs.ReadXml(PathToPairsXML);
listBox1.DataSource = AllPairs.Tables[0];
listBox1.ValueMember = "PAIR_text";
listBox1.DisplayMember = "PAIR_text";

列表框选择属性是MultiExtended

如何删除列表框中选定的表中的多行

当您使用DataTable作为ListBoxDataSource时,项目类型为DataRowView,因此您可以使用DataRowViewDelete方法或使用DataRowViewRow属性访问该数据行视图后面的行并从DataTable中删除该行。

您可以使用以下代码:

this.listBox1.SelectedItems.Cast<DataRowView>()
    .ToList()
    .ForEach(item =>
    {
        //item.Delete(); 
        //or
        this.AllPairs.Tables[0].Rows.Remove(item.Row);
    });
string  selectedtext= "";    
foreach (int i in listBox1 .SelectedIndices )
    {
       selectedtext= listBox1.Items[i].ToString ();
       DataRow[] drCollection=AllPairs.Tables[0].Select("PAIR_text='"+selectedtext+"'");
      if (drCollection.Length>0)
                AllPairs.Tables[0].Rows.Remove(drCollection[0]);
    }

这是目前为止最简单的方法:

var selectedRows = listBox1.SelectedItems.Cast<DataRowView>().ToList();
foreach (var dr in selectedRows)
    dr.Delete();

一个小小的解释。为了更好地理解,我将使用具体类型而不是var关键字。下面这行

listBox1.DataSource = AllPairs.Tables[0];

等价于

DataView dataView = AllPairs.Tables[0].DefaultView;
for (int i = 0; i < dataView.Count; i++)
{
    DataRowView dataRowView = dataView[i];
    listBox1.Items.Add(dataRowView);
}

现在,当我们知道列表框包含DataRowView对象时,尽管SelectedItems返回类型为object的项,我们可以安全地将它们强制转换回DataRowView并调用Delete方法。但是为什么我们需要ToList呼叫?因为当我们删除一行时,数据源将向列表框发送通知,它将从ItemsSelectedItems中删除该项。虽然这不是必需的,但根据内部实现,这可能会破坏选择。因此,为了绝对确保不会发生这种情况,我们在继续删除之前缓冲列表中的初始选择。