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