如何在其他ListBox2项中查找ListBox1.SelectedItem

时间:2011-08-22 03:43:02

标签: c# winforms linq listbox

我想过滤一个列表的项目并将结果显示到另一个列表中。当我通过调用.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中选择所选项目,因为上一个if不会是真的。

请告诉我有什么问题。感谢

3 个答案:

答案 0 :(得分:1)

我找到了解决方案:

 //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();

答案 1 :(得分:0)

您的问题是使用CopyToDataTable方法。如果您阅读摘要:

  

返回一个System.Data.DataTable,它包含System.Data.DataRow对象的副本,给定输入System.Collections.Generic.IEnumerable对象,其中泛型参数T为System.Data.DataRow。

这意味着在'if'比较时,listBox2.Items包含与listbox1.DataSource中包含的不同的实例(具有相同的信息) - 这包括listbox1.SelectedItem,因此listbox2.Items永远不包含listbox1.SelectedItem。< / p>

答案 2 :(得分:0)

listBox1的selectedItem对象不在listBox2中。这是由于行listBox2.DataSource = x.CopyToDataTable()创建了一个新列表。这两个列表框指向相同的数据源,但它们在每个列表框中都表示完全不同的ListItem。

解决方法是迭代listBox2并搜索所选项目。