c#如果两个列表视图包含它,则选择列表视图项

时间:2017-03-05 11:39:48

标签: c# .net winforms listview

在我的程序中,我有2个listviews和1个按钮。 当我按下按钮时,第一个列表视图中的每个列表视图项目都将在第二个列表视图中被选中(并且该项目始终存在于第二个列表视图中)。

我在选择项目时遇到问题,因为第一个和第二个列表视图中的索引不是相同的项目。所以我试图用IndexOf来获取索引。

foreach (ListViewItem item in firstListView.Items)
{
     int index = secondListView.Items.IndexOf(item);
     secondListView.Items[index].Selected = true;
     secondListView.Select();
}

单击按钮时,我始终收到index-1的错误消息。我不明白我做错了什么。

修改

列表视图有8列。第一栏文字通常为0 我只能使用IndexOf作为第一列。但我想检查所有列。我已经找到了一个很好的解决方案。

感谢所有试图提供帮助的人。

4 个答案:

答案 0 :(得分:1)

同样的项目显然不能存在于两个不同的列表中。

如果文字相同,请尝试查看:

foreach (ListViewItem listViewItem in l2.Items.Cast<ListViewItem>()
    .Where(lvi => l1.Items.Cast<ListViewItem>().Any(lvi2 => lvi.Text == lvi2.Text))
{
     listVieItem.Selected=true;
}

或者:

mEditText.addTextChangedListener(new TextWatcher() {
        public void afterTextChanged(Editable s) {

        }
        public void beforeTextChanged(CharSequence s, int start, 
            int count, int after) {
            lengthBeforeType = mEditText.getText().toString().length();

        }
        public void onTextChanged(final CharSequence s, final int start, 
            int before, final int count) {
            lengthAfterType = mEditText.getText().toString().length();
            new Thread(new Runnable() {
                @Override
                public void run() {

                    try {
                        if((lengthAfterType-lengthBeforeType)<0){
                            session.stopTyping();
                        }else{
                            session.typing();
                        }
                    } catch (OmegleException e) {
                        e.printStackTrace();
                    }
                }
            }).start();

答案 1 :(得分:1)

您可以使用此类linq查询来选择第一个列表中存在的第二个列表中的项目:

var items = from i1 in listView1.Items.Cast<ListViewItem>()
            from i2 in listView2.Items.Cast<ListViewItem>()
            where i1.SubItems.Cast<ListViewItem.ListViewSubItem>()
                    .Where((s, i) => s.Text != i2.SubItems[i].Text).Count() == 0
            select i2;
items.ToList().ForEach(x => { x.Selected = true; });

注意: 何时尝试使用secondListView.Items.IndexOf方法查找属于firstListView的项目,您不能指望它找到该项目。您尝试查找其索引的项目不存在于第二个列表视图的项目集合中。您应该使用项目和子项目的Text属性找到项目。

答案 2 :(得分:0)

如果IndexOf找不到在列表中传递给它的对象,则返回-1。我的猜测是你的平等比较存在问题。列表中的对象是否实现了IComparable?否则他们可能无法正确找到项目并且正在恢复不良的平等比较。 ListViewItem可能无法比较您的预期。

答案 3 :(得分:0)

您可以尝试按文字查找项目,然后像这样获取索引

   foreach (ListViewItem item in firstListView.Items)
        {

            var itm = secondListView.FindItemWithText(item.Text);
            int index = secondListView.Items.IndexOf(itm);
            secondListView.Items[index].Selected = true;
            secondListView.Select();
        }

FindItemWithText将要做的是secondListView中的项目与firstListView中的名称相同,而IndexOf将获得{{1}中的项目索引}}

修改

如果您有两个项目相同且名称不包含任何重复的列表,如果secondListView中有两个名称相同的项目secondListView将只获得第一项,则此解决方案很好