C# erreur de compilation: “Invoquer ou BeginInvoke ne peut pas être appelée sur un contrôle jusqu'à ce que la poignée de la fenêtre a été créé.”

Je viens de poster une question sur comment à obtenir un délégué de mettre à jour une zone de texte sur une autre forme. Juste quand je pensais que j'avais la réponse à l'aide de l'Invoquer...ce qui se passe. Voici mon code:

Principale Forme De Code:

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();
    }

}

Journalisation Code De Classe:

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);
        }
    }
}
  • Erreur De Compilation:

    InvalidOperationException a été
    non - Appeler ou BeginInvoke
    ne peut pas être appelée sur un contrôle jusqu'à ce que
    la poignée de la fenêtre a été créé.

J'ai déjà essayé de créer un handle sur l'élément de Journal...mais cela ne fonctionne pas. Le problème est que je n'ai AUCUNE IDÉE de ce que je fais et j'ai cherché sur Google largement seulement pour trouver des réponses vagues.

S'il vous plaît dites-moi comment faire pour créer la poignée avant, j'invoque de ce délégué. Si vous êtes à elle, donnez-moi quelques façons de rendre ce code plus simple. Par exemple, je ne veux pas Ajouter deux fonctions... j'ai eu à faire car il n'y avait aucun moyen pour moi de trouver un élément pour appeler à partir de la classe de log. Est-il une meilleure façon d'accomplir ce que je dois faire?

Merci!!!!!!

EDIT:

Mon projet est assez grand, mais ce sont les seuls éléments à l'origine de ce problème spécifique.

Journal est mon RichTextBox1 (Log.Éléments.Ajouter(message)) je l'ai renommé pour vous Connecter sorte qu'il est plus facile de se retaper.

Je fais appel updateLog(message) à partir d'une forme différente mais...permettez-moi de mise à jour ici (bien qu'il ne fait aucune différence lorsque j'appelle updateLog(message) à partir il me donne toujours cette erreur)

Les gars, vous allez avoir à faire des choses plus simple pour moi...et de donner des exemples. Je ne comprends pas la MOITIÉ de tout ce que vous les gars sont en train de dire...je n'ai aucune idée sur la manière de travailler avec l'Invocation de méthodes et de Poignées. J'ai recherché la merde hors de lui aussi...

DEUXIÈME EDIT:

Je crois que j'ai localisé le problème, mais ne savez pas comment le résoudre.

Dans ma classe de log, j'utilise ce code pour créer mainClass:

statique Principal mainClass = new Main();

Je suis entrain de créer un tout nouveau modèle de réplique à Main(), y compris Journal (le richtextbox, je suis en train de mettre à jour)

Quand je l'appelle updateLog(message) je crois que je suis en train de mettre à jour le Journal (richtextbox) sur la deuxième entité de Main (), autrement connu comme mainClass. Bien sûr, cela va me jeter cette exception parce que je n'ai même pas vu que la réplique de l'actuel je suis aide.

C'est ce que je suis en tournage pour, grâce à l'une des personnes qui ont donné une réponse:

Main mainClass = Application.OpenForms.OfType<Main>().First();
logAddDelegate = mainClass.logAdd; 
logAddDelegate(message);

J'ai besoin de créer mainClass pas avec la nouvelle() de l'opérateur, car je ne veux pas créer un nouveau plan de la forme que je veux être en mesure de modifier la forme actuelle.

Le code ci-dessus ne fonctionne pas bien, je ne peux même pas trouver Application. C'est que même la syntaxe C#?

Si je peux obtenir le code ci-dessus fonctionne, je pense que je peux résoudre mon problème et enfin poser ce problème pour se reposer après une couple d'HEURES de recherche pour trouver les réponses.

FINAL EDIT:

J'ai tout compris grâce à l'un des utilisateurs ci-dessous. Voici mon code mis à jour:

Principale Forme De Code:

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();
}
}

Journalisation Code De Classe:

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);
}
}
}
Êtes-vous absolument sûr que c'est une erreur du compilateur? Ça sonne beaucoup plus comme un temps d'exécution exception pour moi...
Êtes-vous sûr que mainClass est la même instance de Principal de ce que vous êtes en train de regarder? Est-il possible que vous avez deux instances créée et l'autre pas?
Les gars ... je ne suis pas sûr moi-même...cette partie m'a tellement confus je ne sais ce qui se passe plus lol
"il problème est que je n'ai AUCUNE IDÉE de ce que je fais"... oui, c'est un problème... 🙂
Je reçois une chose de travailler, et puis 5 minutes plus tard, quelque chose se brise. Si seulement je pouvais obtenir un bon exemple, je voudrais savoir exactement ce que quelqu'un parlait.

OriginalL'auteur OneShot | 2009-02-04