如何删除列表框中选定的表中的多行
本文关键字:何删除 删除 列表 | 更新日期: 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
作为ListBox
的DataSource
时,项目类型为DataRowView
,因此您可以使用DataRowView
的Delete
方法或使用DataRowView
的Row
属性访问该数据行视图后面的行并从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
呼叫?因为当我们删除一行时,数据源将向列表框发送通知,它将从Items
和SelectedItems
中删除该项。虽然这不是必需的,但根据内部实现,这可能会破坏选择。因此,为了绝对确保不会发生这种情况,我们在继续删除之前缓冲列表中的初始选择。