Pertimbangkan:
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();
}
}
}
Mengapa kesalahan ini terjadi?
referensi objek diperlukan untuk tidak mandek lapangan, metode, atau properti 'WindowsApplication1.Form1.setTextboxText(int)
Sepertinya anda menelepon non statis properti dari metode statis. Anda akan perlu untuk membuat tamu statis, atau membuat sebuah instance dari Form1.
static void SetTextboxTextSafe(int result)
{
label1.Text = result.ToString();
}
ATAU
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);
}
Info lebih lanjut tentang kesalahan ini dapat ditemukan di MSDN.
Untuk kasus ini, di mana anda ingin mendapatkan Kontrol dari Bentuk dan menerima kesalahan ini, maka saya memiliki sedikit privasi untuk anda.
Pergi ke Program anda.cs dan perubahan
Application.Run(new Form1());
untuk
public static Form1 form1 = new Form1(); // Place this var out of the constructor
Application.Run(form1);
Sekarang anda dapat mengakses control dengan
Program.form1.<Your control>
Juga: Don't lupa untuk mengatur Kontrol-Access-Level untuk Umum.
Dan ya aku tahu, ini jawaban tidak sesuai dengan pertanyaan penelepon, tapi cocok untuk karyawan google yang memiliki masalah khusus ini dengan kontrol.
Metode anda harus statis
static void setTextboxText(int result)
{
if (this.InvokeRequired)
{
this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result });
}
else
{
SetTextboxTextSafe(result);
}
}
Kredit untuk @COOLGAMETUBE untuk memberi tahuku apa yang akhirnya bekerja untuk saya. Ide-nya adalah baik tapi aku punya masalah ketika Aplikasi.SetCompatibleTextRenderingDefault dipanggil setelah formulir sudah dibuat. Sehingga dengan sedikit perubahan, ini bekerja untuk saya:
statis kelas Program
{
public static Form1 form1; // = new Form1(); // Tempat ini var keluar dari constructor
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(form1 = new Form1());
}
}
Saya melihat anda memberikan nilai null untuk textbox dan kembali dalam ToString()
seperti ini adalah metode statis. Anda dapat menggantinya dengan Mengkonversi.ToString()
yang dapat memungkinkan nilai null.
Aku benar-benar punya kesalahan ini karena aku sedang memeriksa InnerHtml untuk beberapa konten yang dihasilkan secara dinamis yaitu kontrol yang runat= "server".
Untuk memecahkan masalah ini aku harus menghapus "statis" kata kunci pada metode saya, dan itu berlari dengan baik.