#c#
#c#
Вопрос:
Рассмотрим:
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 resu<
//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();
}
}
}
Почему возникает эта ошибка?
Ссылка на объект требуется для нестатического поля, метода или свойства ‘WindowsApplication1.Form1.setTextboxText(int)
Ответ №1:
Похоже, что вы вызываете нестатический элемент (свойство или метод, в частности setTextboxText
) из статического метода (в частности SumData
). Вам нужно будет либо:
-
Также сделайте вызываемый элемент статическим:
static void setTextboxText(int result) { // Write static logic for setTextboxText. // This may require a static singleton instance of Form1. }
-
Создайте экземпляр
Form1
внутри вызывающего метода:private static void SumData(object state) { int result = 0; //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); }
Передача экземпляра
Form1
также была бы вариантом. -
Сделайте вызывающий метод нестатическим методом экземпляра (of
Form1
):private void SumData(object state) { int result = 0; //int[] icount = (int[])state; int icount = (int)state; for (int i = icount; i > 0; i--) { result = i; System.Threading.Thread.Sleep(1000); } setTextboxText(result); }
Дополнительную информацию об этой ошибке можно найти в MSDN.
Ответ №2:
В этом случае, когда вы хотите получить контроль над формой и получаете эту ошибку, у меня есть для вас небольшой обходной путь.
Перейдите в свой Program.cs и измените
Application.Run(new Form1());
Для
public static Form1 form1 = new Form1(); // Place this var out of the constructor
Application.Run(form1);
Теперь вы можете получить доступ к элементу управления с помощью
Program.form1.<Your control>
Также: не забудьте установить для вашего Control-Access-Level значение Public.
И да, я знаю, этот ответ не подходит для вызывающего вопрос, но он подходит для пользователей Google, у которых есть эта конкретная проблема с элементами управления.
Ответ №3:
Вы запускаете поток, который запускает статический метод SumData
. Однако SumData
вызовы SetTextboxText
, которые не являются статическими. Таким образом, для вызова вам нужен экземпляр вашей формы SetTextboxText
.
Комментарии:
1. Этот ответ, похоже, повторяет проблему. Это не объясняет, почему это приводит к ошибке.
2. @Robert Ни один из других ответов … этот комментарий был бессмысленным
Ответ №4:
Ваш метод должен быть статическим
static void setTextboxText(int result)
{
if (this.InvokeRequired)
{
this.Invoke(new IntDelegate(SetTextboxTextSafe), new object[] { result });
}
else
{
SetTextboxTextSafe(result);
}
}
Комментарии:
1. Этот конкретный метод явно обращается к свойствам экземпляра (в частности
this.InvokeRequired
, иthis.Invoke
) и поэтому не может быть сделан статическим.
Ответ №5:
Спасибо @COOLGAMETUBE за то, что подсказал мне, что в итоге у меня получилось. Его идея была хорошей, но у меня возникла проблема при применении.SetCompatibleTextRenderingDefault был вызван после того, как форма уже была создана. Итак, с небольшим изменением, это работает для меня:
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());
}
}
Ответ №6:
На самом деле я получил эту ошибку, потому что я проверял innerHTML на наличие некоторого содержимого, которое было сгенерировано динамически, то есть элемента управления runat = server .
Чтобы решить эту проблему, мне пришлось удалить ключевое слово «static» в моем методе, и все прошло нормально.
Ответ №7:
Насколько я понимаю, вы присваиваете текстовому полю нулевое значение и возвращаете его в a ToString()
, поскольку это статический метод. Вы можете заменить его на Convert.ToString()
, которое может включить нулевое значение.
Ответ №8:
Суть и решение вашей проблемы заключается в следующем:
using System;
namespace myNameSpace
{
class Program
{
private void method()
{
Console.WriteLine("Hello World!");
}
static void Main(string[] args)
{
method();//<-- Compile Time error because an instantiation of the Program class doesnt exist
Program p = new Program();
p.method();//Now it works. (You could also make method() static to get it to work)
}
}
}
Ответ №9:
Сделайте функцию статической. Это должно решить вашу проблему.