Я только что опубликовал вопрос о том, как заставить делегата обновить текстовое поле в другой форме. Просто когда я думал, что у меня есть ответ, используя 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);
}
}
}
Я уже пытался создать дескриптор для элемента журнала ... но это не сработало. Проблема в том, что я не знаю, что я делаю, и я искал в Google * , только чтобы найти расплывчатые ответы.
Пожалуйста, скажите мне, как создать дескриптор, прежде чем я вызову этого делегата. Пока вы это делаете, дайте мне несколько способов сделать этот код более простым. Например, мне не нужны две функции Add ... Я должен был это сделать, потому что у меня не было возможности найти элемент для вызова из класса Logging. Есть ли лучший способ выполнить то, что мне нужно сделать?
Спасибо !!!
EDIT:
Мой проект довольно большой, но это единственные элементы, вызывающие эту конкретную проблему.
Log - это мой RichTextBox1 (Log.Items.Add (message)) Я переименовал его в Log, чтобы его было легче перепечатать.
Я вызываю updateLog (сообщение) из другой формы, хотя ... позвольте мне обновить это здесь (хотя нет никакой разницы, где я вызываю updateLog (сообщение) из него, все еще дает мне эту ошибку)
Вам, ребята, придется сделать все проще для меня ... и привести примеры. Я не понимаю ПОЛОВИНУ всего, что вы, ребята, говорите здесь ... Я понятия не имею, как работать с Invoking методов и дескрипторов. Я тоже исследовал это дерьмо ...
ВТОРОЕ РЕДАКТИРОВАНИЕ:
Мне кажется, я обнаружил проблему, но не знаю, как ее исправить.
В моем классе регистрации я использую этот код для создания mainClass:
статический Main mainClass = новый Main ();
Я создаю совершенно новую копию проекта для Main (), включая Log (richtextbox, который я пытаюсь обновить)
Когда я вызываю updateLog (message), я полагаю, что пытаюсь обновить Log (richtextbox) на втором объекте Main (), также известном как mainClass. Конечно, из-за этого я получу это исключение, потому что я даже не видел точную копию текущего Main, который я использую.
Это то, за что я стреляю, благодаря одному из людей, который дал ответ:
Main mainClass = Application.OpenForms.OfType<Main>().First();
logAddDelegate = mainClass.logAdd;
logAddDelegate(message);
Мне нужно создать mainClass не с оператором new (), потому что я не хочу создавать новый проект формы, я хочу иметь возможность редактировать текущую форму.
Приведенный выше код не работает, хотя я даже не могу найти приложение. Это даже синтаксис 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);
}
}
}