主窗体代码:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Data.OleDb;
using System.Collections.Specialized;
using System.Text;
using System.Threading;
delegate void logAdd(string message);
namespace LCR_ShepherdStaffupdater_1._0
{
public partial class Main : Form
{
public Main()
{
InitializeComponent();
}
public void add(string message)
{
this.Log.Items.Add(message);
}
public void logAdd(string message)
{ /////////////////////////// COMPILER ERROR BELOW ///////////
this.Invoke(new logAdd(add), new object[] { message }); // Compile error occurs here
}////////////////////////////// COMPILER ERROR ABOVE ///////////
private void exitProgramToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void aboutToolStripMenuItem1_Click(object sender, EventArgs e)
{
Form aboutBox = new AboutBox1();
aboutBox.ShowDialog();
}
private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void settingsToolStripMenuItem1_Click(object sender, EventArgs e)
{
settingsForm.settings.ShowDialog();
}
private void synchronize_Click(object sender, EventArgs e)
{
string message = "Here my message is"; // changed this
ErrorLogging.updateLog(message); // changed this
}
}
public class settingsForm
{
public static Form settings = new Settings();
}
}
记录类代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LCR_ShepherdStaffupdater_1._0
{
public class Logging
{
static Main mainClass = new Main();
static logAdd logAddDelegate;
public static void updateLog(string message)
{
logAddDelegate = mainClass.logAdd;
logAddDelegate(message);
}
}
}
编译错误:
InvalidOperationException未处理 - 在窗口句柄创建之前,不能在控件上调用Invoke或BeginInvoke。
我已经尝试在Log项上创建一个句柄,但没有起作用。问题是我不知道自己在做什么,而且我已经通过Google广泛搜索,只找到了模糊的答案。
请告诉我如何在调用此委托之前创建句柄。顺便说一下,给我一些让这段代码更简单的方法。例如,我不想有两个Add函数……我不得不这样做是因为我找不到从Logging类调用的项来调用。有没有更好的方法来完成我需要做的事情?
谢谢!!!
编辑:
我的项目相当大,但这些是导致此特定问题的唯一项目。
Log是我的RichTextBox1(Log.Items.Add(message)),我将其重命名为Log,以便更容易重新输入。
我从不同的表单中调用updateLog(message)...虽然无论我从哪里调用updateLog(message),它都会给我这个错误)
你们必须让我更简单地理解事物,并提供示例。我不理解你们在这里说的一半......我不知道如何使用方法和句柄进行工作。我已经对它进行了大量研究......
第二次编辑:
我相信我已经找到了问题,但不知道该如何解决。
在我的日志记录类中,我使用以下代码创建mainClass:
static Main mainClass = new Main();
我正在创建一个完全新的Main()蓝图副本,包括Log(我正在尝试更新的richtextbox)
当我调用updateLog(message)时,我相信我正在尝试更新Main()的第二个实体上的Log(richtextbox),也就是mainClass。当然,这样做会抛出此异常,因为我甚至没有看到当前正在使用的Main的副本。
这就是我想要的,感谢其中一个给出答案的人:
Main mainClass = Application.OpenForms.OfType<Main>().First();
logAddDelegate = mainClass.logAdd;
logAddDelegate(message);
我需要创建mainClass,但不使用new()运算符,因为我不想创建一个新的表单蓝图,我希望能够编辑当前的表单。
尽管上面的代码不起作用,我甚至找不到Application。那是C#语法吗?
如果我能让上面的代码运行起来,我认为我可以解决我的问题,并在寻找答案几个小时后终于解决这个问题。
最终编辑:
由于下面的用户之一,我弄清楚了。这是我的更新后的代码:
主表单代码:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Data.OleDb;
using System.Collections.Specialized;
using System.Text;
using System.Threading;
delegate void logAdd(string message);
namespace LCR_ShepherdStaffupdater_1._0
{
public partial class Main : Form
{
private static Main mainFormForLogging;
public static Main MainFormForLogging
{
get
{
return mainFormForLogging;
}
}
public Main()
{
InitializeComponent();
if (mainFormForLogging == null)
{
mainFormForLogging = this;
}
}
public void add(string message)
{
this.Log.Items.Add(message);
}
public void logAdd(string message)
{
this.Log.BeginInvoke(new logAdd(add), new object[] { message });
}
private void exitProgramToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void aboutToolStripMenuItem1_Click(object sender, EventArgs e)
{
Form aboutBox = new AboutBox1();
aboutBox.ShowDialog();
}
private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
}
private void settingsToolStripMenuItem1_Click(object sender, EventArgs e)
{
settingsForm.settings.ShowDialog();
}
private void synchronize_Click(object sender, EventArgs e)
{
add("test");
Logging.updateLog("testthisone");
//DatabaseHandling.createDataSet();
}
}
public class settingsForm
{
public static Form settings = new Settings();
}
}
日志记录类代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LCR_ShepherdStaffupdater_1._0
{
public class Logging
{
static Main mainClass = Main.MainFormForLogging;
static logAdd logAddDelegate;
public static void updateLog(string message)
{
logAddDelegate = mainClass.logAdd;
logAddDelegate(message);
}
}
}