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