Почему возникает ошибка
LectureForm
— это класс формы, таких форм можно создать сколько угодно.
btnNext
— это свойство экземпляра класса формы. Это кнопка, которая лежит на конкретном экземпляре формы.
Ошибка говорит о том, что Вы пытаетесь через класс обратиться к свойству объекта этого класса, так делать нельзя.
Общие данные
Т.к. LectureForm
показывается отдельно от Param
, то обратиться к объекту LectureForm
нельзя т.к. форма еще не создана.
В этом случае нужно чтобы Param
записала данные куда-нибудь откуда lectureForm
может их считать.
Можно например объявить глобальное статическое поле в каком-нибудь классе. Например, в том же Param
сделать ему значение по-умолчанию false и изменять его при нажатии на checkbox:
//поле внутри класса `Param`
public static bool LectureFormButtonsVisible = true;
...
//установка в обработчике checkBox
listBox2.Visible = false;
LectureFormButtonsVisible = checkBox1.Checked;
Потом при отображении LectureForm
это поле можно будет считать:
private void LectureForm_Load(object sender, EventArgs e)
{
btnNext.Visible = Param.LectureFormButtonsVisible;
WMP.Visible = Param.LectureFormButtonsVisible;
}
Как будет время почитайте про проекты проектирования, про то как можно отделить интерфейс от логики. При правильной архитектуре приложения у форм будет доступ к общей модели и они сами будут реагировать на изменение. Построение такой архитектуры сильно зависит от Вашего приложения и, пожалуй, сильно выходит за рамки этого вопроса.
Flooopsik 0 / 0 / 0 Регистрация: 11.01.2020 Сообщений: 4 |
||||||||||||
1 |
||||||||||||
Для нестатического поля, метода или свойства требуется ссылка на объект11.01.2020, 21:52. Показов 13603. Ответов 3 Метки нет (Все метки)
Здравствуйте, не могу решить проблемы в программе. Список ошибок: Ошибка CS0120 Для нестатического поля, метода или свойства “MathLangParser.Parse(string)” требуется ссылка на объект.
0 |
samana 2628 / 1597 / 851 Регистрация: 23.02.2019 Сообщений: 3,876 |
||||||||
11.01.2020, 22:21 |
2 |
|||||||
Сообщение было отмечено Flooopsik как решение Решение Вы пытаетесь вызвать обычные методы в статическом методе, так не работает.
Либо оставьте эти методы обычными, но тогда перед их вызовом нужно создать экземпляр их класса:
В вашем случае, конечно правильнее сделать методы статичными, как в первом коде.
1 |
2727 / 1644 / 869 Регистрация: 14.04.2015 Сообщений: 5,608 |
|
11.01.2020, 22:23 |
3 |
Flooopsik, во-первых, ошибка говорит о том, что нет ссылки на определенную сборку. а взять ее можно из GitHub https://github.com/ArtObr/PascalCompilator но это тоже не решит проблемы, так как исходный метод Execute в классе MathLangIntepreter не имеет параметров, а ты в него пытаешься что-то передать. что касается Parse в MathLangParser, то его беглым взглядом вообще найти не удалось, откуда ты его откопал, не известно.
1 |
Модератор 13756 / 9975 / 2654 Регистрация: 21.04.2018 Сообщений: 29,703 Записей в блоге: 2 |
|
12.01.2020, 02:24 |
4 |
Flooopsik, вы приводите текст ошибок, НО не приводите файлы и номера строк где они возникли. Вы привели коды двух методов
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
12.01.2020, 02:24 |
Помогаю со студенческими работами здесь Для нестатического поля, метода или свойства требуется ссылка на объект Для нестатического поля, метода или свойства требуется ссылка на объект Для нестатического поля, метода или свойства требуется ссылка на объект Для нестатического поля, метода или свойства требуется ссылка на объект Для нестатического поля, метода или свойства требуется ссылка на объект Ошибка “Для нестатического поля, метода или свойства требуется ссылка на объект” Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 4 |
Привет всем.
сегодня хотел сделать нажатие кнопки по нажатию клавиши на клавиатуре, но столкнулся с проблемой которую я не знаю как решать. Надеюсь подскажите как её решить. заранее спасибо
код:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
class MyButtonClass : Form
{
private Button One, Two, Three, Four, Fife, Six, Seven, Eight, Nine, Zero, Plus, Minus, multiply, division, Equally, dot, Delete, clear, copy, past;
private TextBox FirstText, SecondText, ThirdText;
private void InitializeComponent()
{
this.SuspendLayout();
//
// MyButtonClass
//
this.ClientSize = new System.Drawing.Size(280, 525);
this.Name = "MyButtonClass";
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.ResumeLayout(false);
}
double n, k, res;
int v, b;
public MyButtonClass()
{
v = 0;
b = 0;
Plus = new Button();
Plus.Text = "+";
Plus.Top = 150;
Plus.Left = 210;
Plus.Height = 100;
Plus.Width = 70;
Plus.Click += new System.EventHandler(PlusButton);
this.Controls.Add(Plus);
//Declare, properties and call a button
FirstText = new TextBox();
FirstText.Text = $"0";
FirstText.Top = 10;
FirstText.Left = 0;
FirstText.Height = 50;
FirstText.Width = 210;
this.Controls.Add(FirstText);
//Declare, properties and call a TextBox
SecondText = new TextBox();
SecondText.Text = $"";
SecondText.Top = 50;
SecondText.Left = 0;
SecondText.Height = 50;
SecondText.Width = 210;
this.Controls.Add(SecondText);
//Declare, properties and call a TextBox
ThirdText = new TextBox();
ThirdText.Text = $"0";
ThirdText.Top = 100;
ThirdText.Left = 0;
ThirdText.Height = 50;
ThirdText.Width = 210;
this.Controls.Add(ThirdText);
//Declare, properties and call a TextBox
InitializeComponent();
this.StartPosition = FormStartPosition.Manual;
this.Location = new Point(-5, 0);
}
[STAThread]
static void Main()
{
Application.Run(new MyButtonClass());
//starting objects of class MyButtonClass
}
void PlusButton(object sender, EventArgs e)
{
if (v == 0)
{
SecondText.Text = "+";
v = 1;
}
else if (v == 1)
{
n = double.Parse(FirstText.Text);
k = double.Parse(ThirdText.Text);
if (SecondText.Text == "+")
{
res = n + k;
}
else if (SecondText.Text == "-")
{
res = n - k;
}
else if (SecondText.Text == "x")
{
res = n * k;
}
else if (SecondText.Text == "/")
{
res = n / k;
}
string r = Convert.ToString(res);
FirstText.Text = r;
SecondText.Text = "+";
ThirdText.Text = "0";
v = 1;
}
}
public class FilteredTextBox : TextBox
{
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (e.KeyChar == '+')
{
Plus.PerformClick();
// здесь ошибка
}
base.OnKeyPress(e);
}
}
}
Содержание
- Возникает ошибка компиляции CS0120 при обращении к кнопке на другой форме
- 1 ответ 1
- Почему возникает ошибка
- Общие данные
- CS0120: ссылка на объект требуется для нестатического поля, метода или свойства ‘foo’
- 7 ответы
- C# — Ошибкa CS0120 Для нестатического поля, метода или свойства «Form1.player_name1» требуется ссылка на объект.
- CS0120: ссылка на объект требуется для нестатического поля, метода или свойства ‘foo’
- 7 ответы
- Как вызвать не статическую функцию из статической?
- 2 ответа 2
Возникает ошибка компиляции CS0120 при обращении к кнопке на другой форме
У меня есть три формы — главное меню, Param и LectureForm . Главное меню вызывает обе другие формы.
LectureForm — вызывается через кнопку главного меню. Param вызывается через менюстрип главного меню, она является чем-то вроде настроек.
Param настраивает LectureForm . То есть формы открываются по очереди. Сначала я выбираю файл и т.д. А потом захожу в LectureForm
Мне нужно, чтобы при нажатии на CheckBox в Param кнопка в LectureForm исчезала и появлялась.
Возникает ошибка компиляции:
Ошибка CS0120 Для нестатического поля, метода или свойства «LectureForm.btnNext» требуется ссылка на объект
на строке LectureForm.btnNext.Visible = true;
1 ответ 1
Почему возникает ошибка
LectureForm — это класс формы, таких форм можно создать сколько угодно.
btnNext — это свойство экземпляра класса формы. Это кнопка, которая лежит на конкретном экземпляре формы.
Ошибка говорит о том, что Вы пытаетесь через класс обратиться к свойству объекта этого класса, так делать нельзя.
Общие данные
Т.к. LectureForm показывается отдельно от Param , то обратиться к объекту LectureForm нельзя т.к. форма еще не создана.
В этом случае нужно чтобы Param записала данные куда-нибудь откуда lectureForm может их считать.
Можно например объявить глобальное статическое поле в каком-нибудь классе. Например, в том же Param сделать ему значение по-умолчанию false и изменять его при нажатии на checkbox:
Потом при отображении LectureForm это поле можно будет считать:
Как будет время почитайте про проекты проектирования, про то как можно отделить интерфейс от логики. При правильной архитектуре приложения у форм будет доступ к общей модели и они сами будут реагировать на изменение. Построение такой архитектуры сильно зависит от Вашего приложения и, пожалуй, сильно выходит за рамки этого вопроса.
Источник
CS0120: ссылка на объект требуется для нестатического поля, метода или свойства ‘foo’
Почему возникает эта ошибка?
Ссылка на объект требуется для нестатического поля, метода или свойства WindowsApplication1.Form1.setTextboxText (int)
7 ответы
Похоже, вы вызываете нестатический член (свойство или метод, в частности setTextboxText ) из статического метода (в частности, SumData ). Вам потребуется:
Сделайте также вызываемый член статическим:
Создайте экземпляр Form1 внутри вызывающего метода:
Передача экземпляра Form1 тоже был бы вариант.
Сделайте вызывающий метод нестатическим методом экземпляра (из Form1 ):
Более подробную информацию об этой ошибке можно найти на MSDN.
ответ дан 01 апр.
В этом случае, когда вы хотите получить элемент управления формой и получаете эту ошибку, у меня есть для вас небольшой обходной путь.
Зайдите в свой Program.cs и измените
Теперь вы можете получить доступ к элементу управления с помощью
Также: не забудьте установить для Control-Access-Level значение Public.
И да, я знаю, этот ответ не подходит для вызывающего вопрос, но он подходит для гуглеров, у которых есть эта конкретная проблема с элементами управления.
ответ дан 15 окт ’17, 18:10
Вы запускаете поток, который запускает статический метод SumData . Тем не менее, SumData звонки SetTextboxText который не статичен. Таким образом, вам нужен экземпляр вашей формы для вызова SetTextboxText .
Этот ответ, кажется, повторяет проблему. Это не объясняет зачем это вызывает ошибку. — Роберт
Ваш метод должен быть статическим
Создан 01 июля ’14, 14:07
Этот конкретный метод явно обращается к свойствам экземпляра (в частности, this.InvokeRequired и this.Invoke ) и поэтому не может быть статичным. — DBC
Благодарим @COOLGAMETUBE за то, что он подсказал мне, что в итоге сработало для меня. Его идея была хорошей, но у меня возникла проблема, когда Application.SetCompatibleTextRenderingDefault был вызван после того, как форма уже была создана. Итак, с небольшими изменениями, это работает для меня:
Создан 27 июля ’18, 03:07
На мой взгляд, вы даете нулевое значение текстовому полю и возвращаете его в ToString() поскольку это статический метод. Вы можете заменить его на Convert.ToString() который может включать нулевое значение.
ответ дан 15 окт ’17, 18:10
На самом деле я получил эту ошибку, потому что проверял InnerHtml на наличие некоторого контента, который был сгенерирован динамически, то есть элемента управления runat = server.
Чтобы решить эту проблему, мне пришлось удалить ключевое слово static в моем методе, и он работал нормально.
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c# or задайте свой вопрос.
Источник
C# — Ошибкa CS0120 Для нестатического поля, метода или свойства «Form1.player_name1» требуется ссылка на объект.
Ошибка CS0120
Скажите пожалуйста как мне изменить значение в label через функцию в моём классе
Вот полностью код
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace game
<
public partial class Form1 : Form
<
public Form1()
<
InitializeComponent();
private void button1_Click(object sender, EventArgs e)
<
player player1 = new player();
player1.name = «Удар пяткой»; player1.link_profile = «»;
player1.strength = 14; player1.age = 18;
player1.info(player1);
>
class player
<
public string name;
public int age, strength;
public float money = 5000;
public string link_profile;
public void info(player playerobj)
<
player_name1.Text(«Имя игрока: <0>«, playerobj.name);
>
>
>
класс player никак не может видеть переменную player_name1, поэтому и ошибка. То есть нужно передать объект класса Label в этот метод.
public void info(player playerobj, Label label)
<
label.Text(«Имя игрока: <0>«, playerobj.name);
>
и в дальнейшем такой подход приведёт к говнокоду. Вашу задачу нужно решать по-другому.
Источник
CS0120: ссылка на объект требуется для нестатического поля, метода или свойства ‘foo’
Почему возникает эта ошибка?
Ссылка на объект требуется для нестатического поля, метода или свойства WindowsApplication1.Form1.setTextboxText (int)
7 ответы
Похоже, вы вызываете нестатический член (свойство или метод, в частности setTextboxText ) из статического метода (в частности, SumData ). Вам потребуется:
Сделайте также вызываемый член статическим:
Создайте экземпляр Form1 внутри вызывающего метода:
Передача экземпляра Form1 тоже был бы вариант.
Сделайте вызывающий метод нестатическим методом экземпляра (из Form1 ):
Более подробную информацию об этой ошибке можно найти на MSDN.
ответ дан 01 апр.
В этом случае, когда вы хотите получить элемент управления формой и получаете эту ошибку, у меня есть для вас небольшой обходной путь.
Зайдите в свой Program.cs и измените
Теперь вы можете получить доступ к элементу управления с помощью
Также: не забудьте установить для Control-Access-Level значение Public.
И да, я знаю, этот ответ не подходит для вызывающего вопрос, но он подходит для гуглеров, у которых есть эта конкретная проблема с элементами управления.
ответ дан 15 окт ’17, 18:10
Вы запускаете поток, который запускает статический метод SumData . Тем не менее, SumData звонки SetTextboxText который не статичен. Таким образом, вам нужен экземпляр вашей формы для вызова SetTextboxText .
Этот ответ, кажется, повторяет проблему. Это не объясняет зачем это вызывает ошибку. — Роберт
Ваш метод должен быть статическим
Создан 01 июля ’14, 14:07
Этот конкретный метод явно обращается к свойствам экземпляра (в частности, this.InvokeRequired и this.Invoke ) и поэтому не может быть статичным. — DBC
Благодарим @COOLGAMETUBE за то, что он подсказал мне, что в итоге сработало для меня. Его идея была хорошей, но у меня возникла проблема, когда Application.SetCompatibleTextRenderingDefault был вызван после того, как форма уже была создана. Итак, с небольшими изменениями, это работает для меня:
Создан 27 июля ’18, 03:07
На мой взгляд, вы даете нулевое значение текстовому полю и возвращаете его в ToString() поскольку это статический метод. Вы можете заменить его на Convert.ToString() который может включать нулевое значение.
ответ дан 15 окт ’17, 18:10
На самом деле я получил эту ошибку, потому что проверял InnerHtml на наличие некоторого контента, который был сгенерирован динамически, то есть элемента управления runat = server.
Чтобы решить эту проблему, мне пришлось удалить ключевое слово static в моем методе, и он работал нормально.
Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c# or задайте свой вопрос.
Источник
Как вызвать не статическую функцию из статической?
Как вызвать не статическую функцию из статической? Или получить доступ из статической функции к tw_tree?
Для нестатического поля, метода или свойства «Window1.ReloadT()» требуется ссылка на объект.
При изменении public void ReloadT() на public static void ReloadT() уже нельзя использовать tw_tree:
Для нестатического поля, метода или свойства «Window1.tw_tree» требуется ссылка на объект.
Так нормально происходит вызов статической функции:
2 ответа 2
Можно, например, передать экземпляр Window1 в Window2.
Или создать событие, на которое подписаться в Window1.
Члены класса (поля, свойства, методы) могут быть статическими или экземплярными. К статическим можно обращаться только в контексте класса, к экземплярным — в контексте объекта (нужно создавать объект класса и обращаться через него).
Использовать не статические члены внутри статических без инициализации объекта нельзя. Чтобы вызвать экземплярный метод, нужно либо создать объект данного класса, либо передать его из вне.
Делать члены статическими нужно в том случае, если они являются общими для всех объектов. Например, есть футболисты и мяч. Мы могли бы сделать мяч не статическим, но тогда каждый будет играть своим мячом — командной игры не получится. Мяч должен быть общим (статическим).
В Вашем случае tw_tree относится к объекту. Если Вы сделаете метод ReloadT() статическим, то при обращении к нему не получится использовать tw_tree, т.к. объект, к которому относится tw_tree не был создан.
Источник
Short answer:
Try this:
public static void loadAnotherRemote()
{
new TypeThatContainsCloseComm(…).closeComm();
}
Longer answer:
First of all, you need to understand static
: Whatever is declared static
does not belong to any particular instance of a type, but belongs to the type itself. That is, if you have a static method TypeThatContainsCloseComm.closeComm
, then you can call it with:
TypeThatContainsCloseComm.closeComm(…)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
// name of the type!
However, all methods that are not declared static
can only be called on a particular instance, because that’s what they belong to:
var commProj = new TypeThatContainsClosePort(); // <- create a instance here
commProj.ClosePort();
// ^^^^^^^^
// instance of a type!
Now, back to your original code:
public void closeComm()
{
commIRToy.ClosePort();
commProj.ClosePort();
commTV.ClosePort();
commAV.ClosePort();
}
public static void loadAnotherRemote()
{
// this method is static, therefore we are not "within" an object instance
closeComm(); // ERROR: closeComm is not static, therefore you need
// some object instance to call it!
}
… and back to your second attempt:
public static void closeComm()
{
commIRToy.ClosePort(); // ERROR if commIRToy, commProj, commTV, commAV
commProj.ClosePort(); // are not declared static, because we're
commTV.ClosePort(); // in a static method and thus "outside" an
commAV.ClosePort(); // object instance, yet these fields are
} // declared within one.
public static void loadAnotherRemote()
{
closeComm(); // this call is fine now, since `closeComm` is static,
// no object instance is required to call it.
}
Short answer:
Try this:
public static void loadAnotherRemote()
{
new TypeThatContainsCloseComm(…).closeComm();
}
Longer answer:
First of all, you need to understand static
: Whatever is declared static
does not belong to any particular instance of a type, but belongs to the type itself. That is, if you have a static method TypeThatContainsCloseComm.closeComm
, then you can call it with:
TypeThatContainsCloseComm.closeComm(…)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
// name of the type!
However, all methods that are not declared static
can only be called on a particular instance, because that’s what they belong to:
var commProj = new TypeThatContainsClosePort(); // <- create a instance here
commProj.ClosePort();
// ^^^^^^^^
// instance of a type!
Now, back to your original code:
public void closeComm()
{
commIRToy.ClosePort();
commProj.ClosePort();
commTV.ClosePort();
commAV.ClosePort();
}
public static void loadAnotherRemote()
{
// this method is static, therefore we are not "within" an object instance
closeComm(); // ERROR: closeComm is not static, therefore you need
// some object instance to call it!
}
… and back to your second attempt:
public static void closeComm()
{
commIRToy.ClosePort(); // ERROR if commIRToy, commProj, commTV, commAV
commProj.ClosePort(); // are not declared static, because we're
commTV.ClosePort(); // in a static method and thus "outside" an
commAV.ClosePort(); // object instance, yet these fields are
} // declared within one.
public static void loadAnotherRemote()
{
closeComm(); // this call is fine now, since `closeComm` is static,
// no object instance is required to call it.
}
In this tutorial, you’ll learn everything about the error “CS0120 – An object reference is required for the nonstatic field, method, or property ‘member’ in C#, why this error appears in your .NET Code and how you can fix them in simple steps.
C# Compiler Error
This is how the CS0120 error in C# looks like in general.
CS0120 – An object reference is required for the nonstatic field, method, or property ‘member’
Reason for the Error
You will receive the CS0120 error in C# when you are trying to access an non-static field, property or method from a static class.
For example, the below code snippet contains a non-static property MyProperty defined in the class by name “DeveloperPublish” and you are trying to access this non-static property from a static method (“Main”) defined in the same class.
namespace DeveloperPublishNamespace { public class DeveloperPublish { public int MyProperty { get; set; } public static void Main() { MyProperty = 1; } } }
This will result with the compiler error CS0120.
Error CS0120 An object reference is required for the non-static field, method, or property ‘DeveloperPublish.MyProperty’ ConsoleApp1 C:UsersSenthilsourcereposConsoleApp1ConsoleApp1Program.cs 9 Active
Solution
To fix the CS0120 Error in C#, avoid accessing the non-static member directly from the static method.
- Remove From My Forums
-
Вопрос
-
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;public class A //Класс A
{
public float a; // Поле а класса А
public float b; // Поле b класса A
public A() { a = 3f; b = 2.5f; } // Конструктор без параметровpublic float c //Свойство с
{
get { return a / b; } //Метод
set { c = value; } //Возвращаемое значение}
}
public class B : A //Класс В — наследник класса А
{
public float d = 10f; // Поле d класса В
public int i;
public float c2 // Свойство с2
{
get { return a + b + d; }
set { c2 = value; }
}
static void Main(string[] args) //Начало программы{
Console.WriteLine(«Введите число и увидите значения «);
Console.WriteLine(«1 — полей a,b,d»);
Console.WriteLine(«2 — свойств с,c2»);
B.i = Console.ReadLine();
switch (B.i) //Проверяем чему равно i
{
case 1: Console.WriteLine(«a={0} «, B.a, «b={0} «, B.b, «d={0} «, B.d); break;
case 2: Console.WriteLine(«2={0} «, B.c, «c2={0} «, B.c2); break;
default:
Console.WriteLine(«Введено неправильное значение «); break;
}
}
}
Ответы
-
Добрый день.
В языке C# разделяют динамические и статические члены класса. То что объявляете вы, например:
public class A //Класс A { public float a; // Поле а класса А }
Это объявление динамического поля. Доступ к нему вне класса может идти только через объектную переменную. Как-нибудь так:
A myObject = new A(); myObject.a = 10;
Чтобы обращаться по имени класса, необходимо член объявить как статический, например, вот так:
public class A //Класс A { public static float a; // Поле а класса А }
К такому полю можно будет обращаться через имя класса:
A.a = 10;
- Изменено
2 декабря 2016 г. 11:05
- Помечено в качестве ответа
Maksim MarinovMicrosoft contingent staff, Moderator
5 декабря 2016 г. 8:27
- Изменено