我刚刚发布了一个关于如何让代表更新另一个表单上的文本框的问题。就在我认为我使用 Invoke 得到答案的时候……这发生了。这是我的代码:
主窗体代码:
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 项上创建一个句柄……但这没有用。问题是我不知道我在做什么,我在谷歌上进行了广泛的搜索,却发现了模糊的答案。
在我调用这个委托之前,请告诉我如何创建句柄。当你在做的时候,给我一些方法可以让这个代码更简单。例如,我不想要两个 Add 函数……我必须这样做,因为我无法从 Logging 类中找到要调用的项目。有没有更好的方法来完成我需要做的事情?
谢谢!!!
编辑:
我的项目相当大,但这些是导致此特定问题的唯一项目。
Log是我的 RichTextBox1 (Log.Items.Add(message)) 我将其重命名为 Log,以便重新键入。
我正在从不同的表单调用 updateLog(message) ......让我在这里更新它(尽管我从它调用 updateLog(message) 没有区别仍然给我这个错误)
你们将不得不让事情对我来说更简单......并提供示例。我不明白你们在这里所说的一切......我不知道如何使用方法和句柄的调用。我也研究了它的废话...
第二次编辑:
我相信我已经找到了问题,但不知道如何解决它。
在我的日志记录类中,我使用此代码创建 mainClass:
静态主 mainClass = new Main();
我正在为 Main() 创建一个全新的蓝图副本,包括Log(我正在尝试更新的 Richtextbox)
当我调用 updateLog(message) 时,我相信我正在尝试更新 Main() 的第二个实体上的日志(富文本框),也称为 mainClass。当然,这样做会抛出这个异常,因为我什至没有看到我正在使用的当前 Main 的副本。
这就是我所追求的,感谢其中一位给出答案的人:
Main mainClass = Application.OpenForms.OfType<Main>().First();
logAddDelegate = mainClass.logAdd;
logAddDelegate(message);
我需要不使用 new() 运算符创建 mainClass,因为我不想创建表单的新蓝图,我希望能够编辑当前表单。
上面的代码不起作用,我什至找不到 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);
}
}
}