C# ListView.Invoke 和 ListView.FindItemWithText 错误

C# ListView.Invoke and ListView.FindItemWithText Error

所以我正在使用 C#Forms,我有 ListView 和 Items,我我正在尝试查找带有文本 的项目。

我在 2 单独的 scripts/classes(1.MainForm.cs 和 2.workWithLists.cs 我需要在 workWithLists.cs) 中使用 FindItemWithText 所以我需要使用 invoke:

ListViewItem v = listView1.Invoke(listView1.FindItemWithText("TestName"));

但是当我使用 Invoke with FindItemWithText:

时出现错误

Cannot convert from "System.Windows.Forms.ListViewItem" to "System.Delegate"

调用:

ListViewItem v = listView1.FindItemWithText("TestName");

我没有任何错误,但是当我 运行 代码时,它给我错误:

Invalid multi-thread operation: An attempt was made to access control 'listView1' from a thread other than the thread it was created on.

请有人向我解释我做错了什么,以及如何解决这个问题。

从线程 listview1 调用 FindItemWithText 不是答案 :D

编辑:我在 MainForm.cs:

中有这段代码
public static ListView list;
public delegate void FindInListViewDelegate(string name);
public FindInListViewDelegate FindInListView = new FindInListViewDelegate(Find);
        

public ListViewItem Find(string name)
{
     ListViewItem item = list.FindItemWithText(name);
     return item;
}

但我收到错误:A field initializer cannot reference the non-static field, method, or property 'MainForm.Find(string)'

我正在改变:

public ListViewItem Find(string name) {}

收件人:

public static ListViewItem Find(string name) {}

但随后又出现另一个错误:'ListViewItem MainForm.Find(string)' has the wrong return type

Control.Invoke 方法,在拥有控件的基础 window 句柄的线程上执行委托。

并且 listView1.FindItemWithText 不是委托,因此在您的主线程中声明一个 Action 或委托并在您的第二个线程中使用它。

主线程:

public delegate void FindInListViewDelegate(string name);

public FindInListViewDelegate FindInListView = new FindInListViewDelegate(Find);

public ListViewItem Find(string name)
{
    var item = listView1.FindItemWitdhText(name);
    ...
}

辅助线程:

myForm.Invoke(myForm.FindInListView, new object[] { nameToSearch });

你也可以使用 Action,我设置了一个小型控制台应用程序:

internal class Program
{
    static public Action<string> FindInListView = (name) =>
    {
        Console.WriteLine($"Finding item {name} in ListView");
    };

    static async Task Main(string[] args)
    {
        await new TaskFactory().StartNew(() => { FindInListView.Invoke("Joan"); });
        return;
    }

}