Considérer:
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//int[] val = { 0, 0};
int val;
if (textBox1.Text == "")
{
MessageBox.Show("Input any no");
}
else
{
val = Convert.ToInt32(textBox1.Text);
Thread ot1 = new Thread(new ParameterizedThreadStart(SumData));
ot1.Start(val);
}
}
private static void ReadData(object state)
{
System.Windows.Forms.Application.Run();
}
void setTextboxText(int result)
{
if (this.InvokeRequired)
{
this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result }); }
else
{
SetTextboxTextSafe(result);
}
}
void SetTextboxTextSafe(int result)
{
label1.Text = result.ToString();
}
private static void SumData(object state)
{
int result;
//int[] icount = (int[])state;
int icount = (int)state;
for (int i = icount; i > 0; i--)
{
result += i;
System.Threading.Thread.Sleep(1000);
}
setTextboxText(result);
}
delegate void IntDelegate(int result);
private void button2_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
Pourquoi cette erreur se produit-elle?
Une référence d'objet est requise pour le champ non statique, la méthode ou la propriété 'WindowsApplication1.Form1.setTextboxText (int)
Il semble que vous appeliez une propriété non statique à partir d'une méthode statique. Vous devrez rendre la propriété statique ou créer une instance de Form1.
static void SetTextboxTextSafe(int result)
{
label1.Text = result.ToString();
}
OR
private static void SumData(object state)
{
int result;
//int[] icount = (int[])state;
int icount = (int)state;
for (int i = icount; i > 0; i--)
{
result += i;
System.Threading.Thread.Sleep(1000);
}
Form1 frm1 = new Form1();
frm1.setTextboxText(result);
}
Plus d'informations sur cette erreur peuvent être trouvées sur MSDN .
Vous démarrez un thread qui exécute la méthode statique SumData
. Cependant, SumData
appelle SetTextboxText
qui n'est pas statique. Ainsi, vous avez besoin d'une instance de votre formulaire pour appeler SetTextboxText
.
Dans ce cas, lorsque vous souhaitez obtenir le contrôle d'un formulaire et que vous recevez cette erreur, j'ai un petit contournement pour vous.
Allez dans votre Program.cs et changez
Application.Run(new Form1());
à
public static Form1 form1 = new Form1(); // Place this var out of the constructor
Application.Run(form1);
Vous pouvez maintenant accéder à un contrôle avec
Program.form1.<Your control>
Aussi: N'oubliez pas de définir votre contrôle-niveau d'accès sur public.
Et oui, je sais, cette réponse ne correspond pas à l'appelant, mais elle convient aux utilisateurs qui ont ce problème spécifique de contrôle.
Votre méthode doit être statique
static void setTextboxText(int result)
{
if (this.InvokeRequired)
{
this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result });
}
else
{
SetTextboxTextSafe(result);
}
}
Nous remercions @COOLGAMETUBE de m'avoir informé de ce qui a finalement fonctionné pour moi. Son idée était bonne mais j'ai eu un problème lorsque Application.SetCompatibleTextRenderingDefault a été appelé après la création du formulaire. Donc, avec un peu de changement, cela fonctionne pour moi:
static class Program
{
public static Form1 form1; // = new Form1(); // Place this var out of the constructor
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(form1 = new Form1());
}
}
En fait, j'ai eu cette erreur parce que je vérifiais InnerHtml pour du contenu généré dynamiquement, c'est-à-dire un contrôle qui est runat = server.
Pour résoudre ce problème, j'ai dû supprimer le mot clé "statique" de ma méthode, et tout s'est bien déroulé.
En regardant, vous donnez une valeur null à une zone de texte et vous retournez dans une ToString()
car c'est une méthode statique. Vous pouvez le remplacer par Convert.ToString()
qui peut activer la valeur null.