我有一张表,其中的内容显示在列表框中。我想删除用户选择的行。如何知道要删除哪些行以及如何删除?
这是我显示列表框项目的方式:
DataSet AllPairs = new DataSet();
AllPairs.ReadXml(PathToPairsXML);
listBox1.DataSource = AllPairs.Tables[0];
listBox1.ValueMember = "PAIR_text";
listBox1.DisplayMember = "PAIR_text";
列表框选择属性是MultiExtended。
答案 0 :(得分:0)
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]);
}
答案 1 :(得分:0)
当您使用DataTable
作为DataSource
的{{1}}时,项目的类型为DataRowView
,因此您可以使用ListBox
Delete
方法或使用DataRowView
Row
属性访问该数据行视图后面的行,并从DataRowView
中删除该行。
您可以使用此代码:
DataTable
答案 2 :(得分: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
中删除该项目。虽然它不是必需的,但根据内部实现,这可能会破坏选择。因此,为了绝对确保不会发生这种情况,我们会在继续删除之前在列表中缓冲初始选择。