Ошибка при обращении к словарю в Form из Usercontrol.
Form1.cs
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Dictionary<string, int> TeamDict = new Dictionary<string, int>();
TestsPage.cs
public partial class TestsPage : UserControl
{
public TestsPage()
{
InitializeComponent();
}
private Form1 mainform = ((Form1)Application.OpenForms["Form1"]);
......
private void button2_Click(object sender, EventArgs e)
{
Console.WriteLine(mainform.TeamDict.Count);
}
An unhandled exception of type ‘System.NullReferenceException’ occurred in Test3.exe
Additional information: Ссылка на объект не указывает на экземпляр объекта.
Словарь не пуст.
задан 2 мая 2021 в 12:02
1
private Form1 mainform = ((Form1)Application.OpenForms["Form1"]);
Эта строка кода выполняется при конструировании юзерконтрола. В этот момент форма ещё не открыта. Соответственно, mainForm
равно null
.
Перенесите код получения формы непосредственно в том место, где она нужна: в событие button2_Click
.
ответ дан 2 мая 2021 в 13:17
Alexander PetrovAlexander Petrov
28.8k5 золотых знаков28 серебряных знаков55 бронзовых знаков
3
CobrDOBR 1 / 1 / 0 Регистрация: 02.05.2015 Сообщений: 15 |
||||
1 |
||||
Ссылка на объект не указывает на экземпляр объекта10.02.2016, 14:15. Показов 88901. Ответов 16 Метки нет (Все метки)
Все объявил, каждой переменной и каждому методу присвоил значения. Однако выходит эта ошибка.
0 |
3106 / 2591 / 1219 Регистрация: 14.05.2014 Сообщений: 7,236 Записей в блоге: 1 |
|
10.02.2016, 14:19 |
2 |
CobrDOBR, какая переменная не указывает на объект?
0 |
CobrDOBR 1 / 1 / 0 Регистрация: 02.05.2015 Сообщений: 15 |
||||
10.02.2016, 15:15 [ТС] |
3 |
|||
@Kerry_Jr, Он ссылается на
0 |
Даценд 5868 / 4745 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
||||||||
10.02.2016, 15:23 |
4 |
|||||||
Есть поле класса:
Здесь объявляется и инициализируется переменная метода:
А в поле класса file ссылка остается равной null.
0 |
1 / 1 / 0 Регистрация: 02.05.2015 Сообщений: 15 |
|
10.02.2016, 15:37 [ТС] |
5 |
Даценд, как она может оставаться null, если я инициализировал в конструкторе?
0 |
Даценд 5868 / 4745 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
||||
10.02.2016, 15:39 |
6 |
|||
Сообщение было отмечено CobrDOBR как решение РешениеCobrDOBR,
Созается новая структура. И следующей строкой вызывается data.Operations(1). А поле file этой новой структуры пока null.
0 |
1 / 1 / 0 Регистрация: 02.05.2015 Сообщений: 15 |
|
10.02.2016, 15:45 [ТС] |
7 |
Все, я понял тебя.
0 |
Даценд 5868 / 4745 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
||||
10.02.2016, 15:51 |
8 |
|||
Сообщение было отмечено CobrDOBR как решение РешениеCobrDOBR,
убрать.
0 |
1 / 1 / 0 Регистрация: 02.05.2015 Сообщений: 15 |
|
10.02.2016, 15:52 [ТС] |
9 |
«сделать полем класса», как? Не серчай если что, учусь)
0 |
Даценд 5868 / 4745 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
||||||||
10.02.2016, 16:00 |
10 |
|||||||
Сообщение было отмечено CobrDOBR как решение РешениеНа 7-й строке объявляете поле:
строка 55:
А строку 80 уберите.
0 |
1 / 1 / 0 Регистрация: 02.05.2015 Сообщений: 15 |
|
10.02.2016, 16:09 [ТС] |
11 |
Не помогло. Все поставил и убрал. Та же ошибка и на то же место. :/ Добавлено через 2 минуты
0 |
5868 / 4745 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
|
10.02.2016, 16:30 |
12 |
CobrDOBR,
0 |
CobrDOBR 1 / 1 / 0 Регистрация: 02.05.2015 Сообщений: 15 |
||||||||||||
10.02.2016, 17:22 [ТС] |
13 |
|||||||||||
Спасибо вам большое! Все наконец заработало. Единственное.
Как объяснить вот эти 2 строчки? Что они вообще делают? Или хотя бы дайте направление, пойду самостоятельно гуглить. Буду безмерно благодарен.
То есть, почему мы пишем именно data = new ShowStudList(); ? Здесь мы просто обращаемся уже к созданному конструктору? Добавлено через 7 минут Сама ошибка пропала, за что отдельное спасибо. Однако в списке ошибок мне выходит «Обнаружен недостижимый код» и ссылается на
Это 38 строка
0 |
Даценд 5868 / 4745 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
||||||||||||
10.02.2016, 17:37 |
14 |
|||||||||||
Сообщение было отмечено CobrDOBR как решение РешениеЗдесь объявляем поле класса формы:
Поле класса может напрямую использоваться в любых нестатических методах или свойствах. Т.е. создаем что-то по назначению напоминающее глобальную переменную.
то это будет совсем другая data.
Добавлено через 5 минут
Однако в списке ошибок мне выходит «Обнаружен недостижимый код» нигде не передается ничего, кроме 1 в Operations(int x)
3 |
CobrDOBR 1 / 1 / 0 Регистрация: 02.05.2015 Сообщений: 15 |
||||||||
10.02.2016, 17:49 [ТС] |
15 |
|||||||
Вот код всей структуры.
Вот в этом методе передается не только 1.
0 |
Даценд 5868 / 4745 / 2940 Регистрация: 20.04.2015 Сообщений: 8,361 |
||||
10.02.2016, 19:15 |
16 |
|||
CobrDOBR,
В конце первой же итерации return studlist делает выход из метода Operations. Второй итерации цикла не будет никогда. Поэтому код недостижимый.
2 |
1 / 1 / 0 Регистрация: 02.05.2015 Сообщений: 15 |
|
10.02.2016, 21:20 [ТС] |
17 |
Чувствую себя идиотом. Спасибо большое тебе!
1 |
Ошибка «Ссылка на объект не указывает на экземпляр объекта» (NullReferenceException) возникает, когда вы пытаетесь обратиться к свойству или методу объекта, который имеет значение null. Для того чтобы найти и исправить причину ошибки, выполните следующие действия:
Отладка
Используйте отладчик Visual Studio для выявления проблемного места. Запустите программу в режиме отладки (нажмите F5), и когда исключение будет вызвано, вы увидите строку кода, где ошибка произошла. Это поможет вам понять, какой объект вызвал исключение.
Проверка обработчиков событий
Даже если вы написали обработчики событий только для кнопок, возможно, автоматически созданный код может содержать обработчики для других элементов, например, для Form. Проверьте раздел событий в окне свойств (Properties window) для различных компонентов вашей формы, чтобы удостовериться, что у вас нет ненужных обработчиков.
Инициализация объектов
Убедитесь, что все объекты, к которым вы обращаетесь, были корректно инициализированы. Например, если у вас есть переменная TextBox textBox1, убедитесь, что вы ее инициализировали, прежде чем обращаться к ее методам или свойствам.
Обработка событий Form
Если исключение возникает при клике на пустую область формы, проверьте, нет ли у вас обработчиков событий для формы, таких как MouseDown, MouseClick, MouseMove и т. д.
Проверка кода в конструкторе формы
Проверьте код в конструкторе вашей формы (Form1() или аналогичный). Иногда ошибка может возникать из-за чего-то, что происходит при создании и инициализации формы.
Исключите внешние библиотеки или компоненты
Если вы используете внешние библиотеки или компоненты, проверьте, не связана ли ошибка с их использованием.
Систематическое исключение
Если вы не можете найти причину, попробуйте систематически закомментировать части вашего кода, чтобы исключить потенциальные проблемные области, пока ошибка не исчезнет. Это может помочь уз Narrow down the cause of the error.
Последние исследования в области искусственного интеллекта показали удивительные результаты. Например, deepnude проект makenude.ai демонстрирует последние разработки в этой области.
Variables in .NET are either reference types or value types. Value types are primitives such as integers and booleans or structures (and can be identified because they inherit from System.ValueType). Boolean variables, when declared, have a default value:
bool mybool;
//mybool == false
Reference types, when declared, do not have a default value:
class ExampleClass
{
}
ExampleClass exampleClass; //== null
If you try to access a member of a class instance using a null reference then you get a System.NullReferenceException. Which is the same as Object reference not set to an instance of an object.
The following code is a simple way of reproducing this:
static void Main(string[] args)
{
var exampleClass = new ExampleClass();
var returnedClass = exampleClass.ExampleMethod();
returnedClass.AnotherExampleMethod(); //NullReferenceException here.
}
class ExampleClass
{
public ReturnedClass ExampleMethod()
{
return null;
}
}
class ReturnedClass
{
public void AnotherExampleMethod()
{
}
}
This is a very common error and can occur because of all kinds of reasons. The root cause really depends on the specific scenario that you’ve encountered.
If you are using an API or invoking methods that may return null then it’s important to handle this gracefully. The main method above can be modified in such a way that the NullReferenceException should never be seen by a user:
static void Main(string[] args)
{
var exampleClass = new ExampleClass();
var returnedClass = exampleClass.ExampleMethod();
if (returnedClass == null)
{
//throw a meaningful exception or give some useful feedback to the user!
return;
}
returnedClass.AnotherExampleMethod();
}
All of the above really just hints of .NET Type Fundamentals, for further information I’d recommend either picking up CLR via C# or reading this MSDN article by the same author — Jeffrey Richter. Also check out, much more complex, example of when you can encounter a NullReferenceException.
Some teams using Resharper make use of JetBrains attributes to annotate code to highlight where nulls are (not) expected.
Я пришел спросить, потому что я новичок в использовании оконных форм, и мне нужна помощь.
У меня есть проект Windows Forms с двумя формами. Основная форма и внутренняя форма.
Я пытаюсь получить доступ к TableLayoutPanel в MainForm из InnerForm, чтобы добавить новые строки в эту панель tablelayoutpanel с некоторыми действиями, которые происходят в InnerForm.
У меня есть следующий код:
Основная форма:
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
TableLayoutPanel panel = tableLayoutPanel1;
panel.ColumnCount = 4;
panel.RowCount = 1;
panel.RowStyles.Add(new RowStyle(SizeType.AutoSize, 0));
panel.Controls.Add(new Label() { Text = "Tag/ID" }, 0, 0);
panel.Controls.Add(new Label() { Text = "Tipo" }, 1, 0);
panel.Controls.Add(new Label() { Text = "Acción" }, 2, 0);
panel.Controls.Add(new Label() { Text = "Ejecutar" }, 3, 0);
}
private void AddInnerForm(string url)
{
var inner = new InnerForm(url)
// more code
}
public void agregarRow(ConsoleMessageEvents args){
// some action with tableLayoutPanel1
}
}
Внутренняя форма:
public partial class InnerForm : UserControl
{
MainForm theMain;
public InnerForm(MainForm main)
{
theMain = main;
}
public InnerForm(string url)
{
InitializeComponent();
// more code
}
private void OnBrowserConsoleMessage(object sender, ConsoleMessageEventArgs args)
{
theMain.agregaRow(args);
}
}
но когда я отлаживаю программу, я получаю эту ошибку:
An unhandled exception of type 'System.NullReferenceException' occurred in Project.exe
Additional information: Object reference not set to an instance of an object.
в этой строке в InnerForm:
private void OnBrowserConsoleMessage(object sender, ConsoleMessageEventArgs args)
{
**theMain.agregaRow(args)**;
}
В чем проблема?