Я только что разместил вопрос о том, как получить делегат для обновления текстового поля в другой форме. Просто, когда я подумал, что у меня есть ответ, используя Invoke ... это происходит. Вот мой код:Ошибка компиляции C#: «Invoke или BeginInvoke нельзя вызвать в элементе управления до тех пор, пока не будет создан дескриптор окна».
Главная форма Код:
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();
}
}
Logging Код класса:
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);
}
}
}
Compile Error:
InvalidOperationException was unhandled - Invoke или BeginInvoke нельзя вызвать на элемент управления до . Создан дескриптор окна.
Я уже пытался создать ручку на пункт Log ... но это не сработало. Проблема в том, что у меня нет НИКАКОГО CLUE, что я делаю, и я искал Google экстенсивно только для того, чтобы найти смутные ответы.
Скажите, пожалуйста, как создать дескриптор, прежде чем я вызову этот делегат. Пока вы на нем, дайте мне несколько способов, чтобы я мог сделать этот код более простым. Например, мне не нужны две функции Add ... Мне пришлось это сделать, потому что мне не удалось найти элемент для вызова из класса Logging. Есть ли лучший способ выполнить то, что мне нужно сделать?
Спасибо!
EDIT:
Мой проект достаточно велик, но это единственные элементы, вызывающие эту конкретную проблему.
Журнал - это мой RichTextBox1 (Log.Items.Add (сообщение)) Я переименовал его в журнал, чтобы его легче было перепечатать.
Я зову updateLog (сообщение) от другой формы, хотя ... позвольте мне обновить, что здесь (хотя это не имеет никакого значения, где я называю updateLog (сообщение) от него до сих пор дает мне эту ошибку)
Вы, ребята, должны будете сделать вещи более упрощенными для меня ... и привести примеры. Я не понимаю ПОЛОВИНУ всего, что вы, ребята, говорите здесь ... Я не знаю, как работать с Invoke of methods и Handles. Я исследовал дерьмо из нее тоже ...
ВТОРОЙ EDIT:
Я считаю, что я находится проблема, но не знаю, как это исправить.
В моем классе лесозаготовительного я использую этот код для создания MainClass:
статического Main MainClass = новый Main();
Я создаю совершенно новый проект реплику Main(), в том числе Вход (RichTextBox Я пытаюсь обновить)
Когда я называю updateLog (сообщение) Я считаю, что я пытаюсь обновить Log (richtextbox) для второго объекта Main(), иначе известного как mainClass. Конечно, это сделает мне это исключение, потому что я даже не видел эту копию текущей Main, которую я использую.
Это то, что я снимаюсь для, благодаря одному из людей, которые дали ответ:
Main mainClass = Application.OpenForms.OfType<Main>().First();
logAddDelegate = mainClass.logAdd;
logAddDelegate(message);
Мне нужно создать MainClass не с новым() оператора, потому что я не хочу, чтобы создать новый чертеж формы, я хочу, чтобы иметь возможность редактировать текущую форму.
Приведенный выше код не работает, я даже не могу найти приложение. Это даже синтаксис C#?
Если я могу заставить приведенный выше код работать, я думаю, что смогу решить мою проблему и, наконец, положить эту проблему на отдых после пары ЧАСОВ поиска ответов.
FINAL EDIT:
Я понял это благодаря одной из следующих пользователей. Вот мой обновленный код:
Главная форма Код:
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();
}
}
Logging Код класса:
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);
}
}
}
Вы абсолютно уверены, что это ошибка компилятора? Это звучит намного больше, как исключение времени выполнения для меня ... –
Вы уверены, что mainClass - это тот же экземпляр Main, на который вы смотрите? Возможно ли, что у вас есть два экземпляра - один создан, а другой нет? –
Ребята ... Я не уверен, что ... эта часть меня так запутала. Я почти не знаю, что происходит дальше. Lol – OneShot