我正在努力填补
DataGridView
。但是,由于我是在 FileSystemWatcher
处理程序(即 静态类)上执行此操作,因此它给了我错误:
An object reference is required for non-static field, method, or property
如果我将类更改为 non-static 那么
EventHandler
会给出相同的错误。我目前处于循环中,找不到解决方案。你能帮我解决这个问题吗?
class FCheck
{
public static void tpCard_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("ThreadId:" + Thread.CurrentThread.ManagedThreadId + " " + "File:" + e.FullPath);
if (Path.GetExtension(e.FullPath) == ".f")
{
// Do something....
Form1.populateTable(tp);
}
}
}
这是主表格1:
public void checkTPFiles()
{
FileSystemWatcher fw = new FileSystemWatcher(@"F:\tmp");
fw.Created += LSCheck.tpCard_Created;
fw.EnableRaisingEvents = true;
}
public static void populateTable(TpCard tpCard)
{
DataGridViewRow row = (DataGridViewRow)dataGridView1.Rows[0].Clone();
row.Cells[1].Value = tpCard.FNumber;
dataGridView1.Rows.Add(row);
}
一个简单的解决方案是将
Form1
实例传递给您的 FCheck
类。
在您的表格1中:
public void checkTPFiles()
{
FileSystemWatcher fw = new FileSystemWatcher(@"F:\tmp");
var fCheck = new FCheck(this); // <= passes Form1 instance
fw.Created += fCheck.tpCard_Created; // <= no static call anymore
fw.EnableRaisingEvents = true;
}
public void populateTable(TpCard tpCard)
{
}
在你的班级F检查:
class FCheck
{
private readonly Form1 _form;
public FCheck(Form1 form)
{
_form = form; // <= remember Form1 instance for future use
}
public void tpCard_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("ThreadId:" + Thread.CurrentThread.ManagedThreadId + " " + "File:" + e.FullPath);
if (Path.GetExtension(e.FullPath) == ".f")
{
// Do something....
_form.populateTable(tp); // <= now it is possible to call instance methods
}
}
}
这不是最好的解决方案,因为这些类是“紧密耦合”的。 使用事件和委托,以便
FCheck
引发事件并且
Form1
对其做出反应,将是更好的方法。上述解决方案是让您运行的第一步。AND 跨线程操作无效:从创建该控件的线程以外的线程访问控制。 基于上面的两篇文章,我为DataGridView编写了这个扩展方法。它在尝试添加到网格列表之前检查 grid.InvokeRequired 。您还可以在此处包含代码来更新/删除列表中的对象。 (我使用的是此处的 SortableBindingList,但如果需要,您可以使用常规绑定列表:https://martinwilley.com/net/code/forms/sortablebindinglist.html
)。根据您的网格,您可能需要在 BindingList 中使用的任何类上使用 INotifyPropertyChanged 接口。