代码之家  ›  专栏  ›  技术社区  ›  badatseesharp

尝试比较两个listviews并将其输出到c中的新listview#

  •  1
  • badatseesharp  · 技术社区  · 8 年前

    因此,我尝试比较两个列表视图,其中包含安装前的服务和安装后的服务

    serviceinfo si = new serviceinfo();
            for (int i = 0; i < listView2.Items.Count; i++)
            {
                string testing = listView1.Items[i].Text;
                //MessageBox.Show(testing);
                ListViewItem item = listView2.FindItemWithText(testing);
                //MessageBox.Show(item.ToString());
                if (item == null)
                { 
                    //MessageBox.Show("Test");
                    si.name = item.Text;
                    listView3.Items.Add(si.name);
                }
                else
                {
                    //MessageBox.Show("Item exists");
                }
            }
    

    如果我将“item==null”更改为“!=”,这将输出所有相等的项-但当它为“==”时,我会得到一个“Object not referenced error”,我理解这是指尝试设置si。name设置为空对象,但我需要文本。

    如能在此方面提供任何帮助,我们将不胜感激。

    2 回复  |  直到 8 年前
        1
  •  0
  •   Steve    8 年前

    也许你需要用这样的东西。代码中的注释解释了逻辑。

    // Loop over the items in the first list....
    for (int i = 0; i < listView1.Items.Count; i++)
    {
        // Get the text of the item at i pos in the first listview
        string testing = listView1.Items[i].Text;
    
        // Search it in the second listview
        ListViewItem item = listView2.FindItemWithText(testing);
    
        // If not found...
        if (item == null)
        { 
            // Add the text to the third listview
            listView3.Items.Add(testing);
        }
        else
        {
            MessageBox.Show("Item exists");
        }
    }
    

    注: 我假设您希望发现最近的安装是否添加了一些新服务,在这种情况下,上面的代码假设第一个ListView是服务列表 之后 安装,第二个ListView包含服务 之前 安装

    如果不是这样,则只需反转ListView变量名称。。。。。 (不过,我建议你给这个对象一个更容易理解的名称,比如lvBeforeInstall、lvAfterInstall和lvAddedServices)

        2
  •  0
  •   Jace    8 年前

    首先,您可以添加 如果(listView1.Items.Count<i)return; 到子例程的顶部。这将避免null-ref。 我强烈建议比较模型中的数据,而不是视图中的数据。学习MVVM或MVC架构,以及如何在当代编程设计模式中处理这个问题,是值得的。