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

How to delete multiple rows in a table that are selected in a listbox?

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

这是我显示列表框项目的方式:

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

列表框选择 属性 是 MultiExtended。

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]);
    }

当您使用 DataTable 作为 ListBoxDataSource 时,项目的类型为 DataRowView,因此您可以使用 Delete 的方法14=] 或使用 DataRowViewRow 属性 访问该数据行视图后面的行并从 DataTable.

中删除该行

您可以使用此代码:

this.listBox1.SelectedItems.Cast<DataRowView>()
    .ToList()
    .ForEach(item =>
    {
        //item.Delete(); 
        //or
        this.AllPairs.Tables[0].Rows.Remove(item.Row);
    });

这是迄今为止最简单的方法:

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 returns 个类型为 object 的项目,我们可以安全地将它们转换回 DataRowView 并调用 Delete 方法。 但是为什么我们需要ToList调用呢?因为当我们删除一行时,数据源会向列表框发送一个通知,它会从 ItemsSelectedItems 中删除该项目。虽然这不是必需的,但根据内部实现,这可能会破坏选择。因此,为了绝对确保不会发生这种情况,我们在继续删除之前将初始选择缓冲在列表中。