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;
}
}
所以我正在使用 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;
}
}