如何找到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不为真。

请告诉我出了什么事。由于

如何找到ListBox1.其他ListBox2项中的SelectedItem

我找到解决办法了:

 //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并搜索所选的项目。