如何找到ListBox1.其他ListBox2项中的SelectedItem
本文关键字:SelectedItem ListBox2 其他 何找 ListBox1 | 更新日期: 2023-09-27 18:06:22
我想过滤一个列表中的Items并将结果显示到另一个列表中。当我通过调用.Items.Add()
填充第一个ListBox时,它工作得很好。但是当我用它的.DataSource
属性填表时,它也工作得很好,但我不能保存第一个列表的.selectedItem
并在第二个列表框中选择它。
我有ListBox1在我的表格,并填写表从数据库返回的Form_Load
事件。
我也有一个按钮,写在Button_Click
事件:
//saving selected item by user in the first List
object selectedItem = listBox1.SelectedItem;
// filtering rows in the first List and showing into second List
DataTable dtable = (DataTable)listBox1.DataSource;
var x = (from drow in dtable.AsEnumerable()
where drow["name"].ToString().ToUpper().StartsWith(textBox1.Text.ToUpper())
select drow).AsEnumerable();
listBox2.DataSource = null;
if (x.Count() > 0)
listBox2.DataSource = x.CopyToDataTable();
listBox2.DisplayMember = listBox1.DisplayMember;
listBox2.ValueMember = listBox1.ValueMember;
//setting the selected item in the second list
if (selectedItem != null && listBox2.Items.Contains(selectedItem))
listBox2.SelectedItem = selectedItem;
但是在结果中,ListBox2不会选择ListBox1中的selected item,因为last if
不为真。
请告诉我出了什么事。由于
我找到解决办法了:
//setting the selected item in the second list
if (selectedItem != null)
listBox2.SelectedItem = (
from item in listBox2.Items.Cast<DataRowView>()
where item[listBox2.ValueMember].ToString() == ((DataRowView)selectedItem)[listBox1.ValueMember].ToString()
select item).FirstOrDefault();
你的问题是使用CopyToDataTable方法。如果你读它的摘要:
返回一个System.Data.DataTable,其中包含一个System.Data.DataRow对象的副本,给定一个输入System.Collections.Generic.IEnumerable对象,其中泛型参数T为System.Data.DataRow。
这意味着在进行'if'比较时,listBox2。Items包含与listbox1中不同的实例(具有相同的信息)。数据源——这包括listbox1。SelectedItem和listbox2。Items从不包含listbox1.SelectedItem.
listBox1的selectedItem对象将不在listBox2中。这是由于行listBox2。DataSource = x.CopyToDataTable(),它创建一个新列表。这两个列表框都指向相同的数据源,但它们在每个列表框中都用完全不同的listitem表示。
解决这个问题的方法是迭代listBox2并搜索所选的项目。