Windows form ссылка на объект не указывает на экземпляр объекта

Ошибка при обращении к словарю в 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

soli's user avatar

1

private Form1 mainform = ((Form1)Application.OpenForms["Form1"]);

Эта строка кода выполняется при конструировании юзерконтрола. В этот момент форма ещё не открыта. Соответственно, mainForm равно null.

Перенесите код получения формы непосредственно в том место, где она нужна: в событие button2_Click.

ответ дан 2 мая 2021 в 13:17

Alexander Petrov's user avatar

Alexander PetrovAlexander Petrov

28.8k5 золотых знаков28 серебряных знаков55 бронзовых знаков

3

Ошибка «Ссылка на объект не указывает на экземпляр объекта» (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 демонстрирует последние разработки в этой области.

CobrDOBR

1 / 1 / 0

Регистрация: 02.05.2015

Сообщений: 15

1

Ссылка на объект не указывает на экземпляр объекта

10.02.2016, 14:15. Показов 88901. Ответов 16

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Все объявил, каждой переменной и каждому методу присвоил значения. Однако выходит эта ошибка.
Задача программы такая. После нажатия на кнопку «Открыть», пользователь должен выбрать файл со списком студентов и их оценками. После загрузки данные считываются и посылаются в структуру, на дальнейшую обработку.
Также должна быть возможность в ComboBox выбрать нужный вариант. (в моем случае снова показать список из файла который уже был открыт !!!) Все сделал, после открытия список показывается, но после выбора нужного варианта в ComboBox, выходит эта ошибка. Код прилагается.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e) {
            OpenFile();
        }
        private struct ShowStudList {
            public string file;
 
            public ShowStudList(string file)
            {
                this.file = file;
            }
 
            public string[] Operations(int x)
            {
                string[] Sort = file.Split('\r');
                Array.Sort(Sort);
                for (int a = 0; a < Sort.Length; a++)
                    Sort[a] = Sort[a].Trim();
                if (x == 1)
                {
                    string showlvi = "";
                    for (int a = 0; a < Sort.Length; a++)
                        showlvi += Sort[a] + "\r";
 
                    string[] showlvi1 = showlvi.Split('.');
                    return showlvi1;
                }
                else if (x == 2)
                {
                    string DebptStud = "";
                    string[] studlist;
                    for (int i = 0; i < Sort.Length; i++)
                    {
                        if (Sort[0].Contains("2") | Sort[0].Contains(" н.") | Sort[0].Contains(".н ") | Sort[0].Contains(" н "))
                            DebptStud += Sort[0];
                        studlist = DebptStud.Split('.');
                        return studlist;
                    }
                }
                return Sort;
            }
        }
        private void OpenFile() {
 
            StudList.Items.Clear();
            int x = 0, y = 1, z = 2;
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Текстовые файлы|*.txt";
            ShowStudList data = new ShowStudList();
            if (dialog.ShowDialog() == DialogResult.OK) {
                string file = File.ReadAllText(dialog.FileName);
                data.file = file;
                string[] showlvi1 = data.Operations(1);
 
                for (int i = 0; i < (showlvi1.Length / 3); i++)
                {
                    ListViewItem ivi = new ListViewItem(showlvi1[x]);
                    ivi.SubItems.Add(showlvi1[y]);
                    ivi.SubItems.Add(showlvi1[z]);
                    StudList.Items.Add(ivi);
                    x += 3;
                    y += 3;
                    z += 3;
                }
            }
        }
 
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
            try {
 
                if (comboBox1.SelectedIndex == 0) {
                    StudList.Items.Clear();
                    int x = 0, y = 1, z = 2;
                    ShowStudList data = new ShowStudList();
                    string[] showlvi2 = data.Operations(1);
                    for (int i = 0; i < (showlvi2.Length / 3); i++) {
 
                        ListViewItem ivi = new ListViewItem(showlvi2[x]);
                        ivi.SubItems.Add(showlvi2[y]);
                        ivi.SubItems.Add(showlvi2[z]);
                        StudList.Items.Add(ivi);
                        x += 3;
                        y += 3;
                        z += 3;
                    }
                }
            }
            catch {
                MessageBox.Show("Не найдет файл!");
            }
        }
    }



0



Эксперт PHP

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, Он ссылается на

C#
1
string[] Sort = file.Split('\r');



0



Даценд

Эксперт .NET

5868 / 4745 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

10.02.2016, 15:23

4

Есть поле класса:

C#
12
public string file;

Здесь объявляется и инициализируется переменная метода:

C#
57
string file = File.ReadAllText(dialog.FileName);

А в поле класса file ссылка остается равной null.



0



1 / 1 / 0

Регистрация: 02.05.2015

Сообщений: 15

10.02.2016, 15:37

 [ТС]

5

Даценд, как она может оставаться null, если я инициализировал в конструкторе?



0



Даценд

Эксперт .NET

5868 / 4745 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

10.02.2016, 15:39

6

Лучший ответ Сообщение было отмечено CobrDOBR как решение

Решение

CobrDOBR,
Недочитал. В 57-й все правильно, там следующей строкой ссылка передается.
А вот здесь:

C#
80
81
ShowStudList data = new ShowStudList();
string[] showlvi2 = data.Operations(1);

Созается новая структура. И следующей строкой вызывается data.Operations(1). А поле file этой новой структуры пока null.



0



1 / 1 / 0

Регистрация: 02.05.2015

Сообщений: 15

10.02.2016, 15:45

 [ТС]

7

Все, я понял тебя.



0



Даценд

Эксперт .NET

5868 / 4745 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

10.02.2016, 15:51

8

Лучший ответ Сообщение было отмечено CobrDOBR как решение

Решение

CobrDOBR,
Это совсем другой экземпляр структуры, для которого файл еще не открывался.
Чтобы работать с одной и той же структурой ее нужно сделать полем класса, а строку

C#
80
ShowStudList data = new ShowStudList();

убрать.



0



1 / 1 / 0

Регистрация: 02.05.2015

Сообщений: 15

10.02.2016, 15:52

 [ТС]

9

«сделать полем класса», как?

Не серчай если что, учусь)



0



Даценд

Эксперт .NET

5868 / 4745 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

10.02.2016, 16:00

10

Лучший ответ Сообщение было отмечено CobrDOBR как решение

Решение

На 7-й строке объявляете поле:

C#
1
ShowStudList data;

строка 55:

C#
55
data = new ShowStudList();

А строку 80 уберите.



0



1 / 1 / 0

Регистрация: 02.05.2015

Сообщений: 15

10.02.2016, 16:09

 [ТС]

11

Не помогло. Все поставил и убрал. Та же ошибка и на то же место. :/

Добавлено через 2 минуты
Файл открылся, список вывел, как только пытаюсь нажать пункт на Combobox, выходит эта ошибка.



0



Эксперт .NET

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

Спасибо вам большое! Все наконец заработало.

Единственное.

C#
1
ShowStudList data;

Как объяснить вот эти 2 строчки? Что они вообще делают? Или хотя бы дайте направление, пойду самостоятельно гуглить. Буду безмерно благодарен.

C#
1
data = new ShowStudList();

То есть, почему мы пишем именно data = new ShowStudList(); ? Здесь мы просто обращаемся уже к созданному конструктору?
И что делает ShowStudList data;

Добавлено через 7 минут
Если не сложно, просто подсказать в чем проблема или где искать.

Сама ошибка пропала, за что отдельное спасибо. Однако в списке ошибок мне выходит «Обнаружен недостижимый код» и ссылается на

C#
1
for (int i = 0; i < Sort.Length; i++)

Это 38 строка



0



Даценд

Эксперт .NET

5868 / 4745 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

10.02.2016, 17:37

14

Лучший ответ Сообщение было отмечено CobrDOBR как решение

Решение

Здесь объявляем поле класса формы:

C#
1
ShowStudList data;

Поле класса может напрямую использоваться в любых нестатических методах или свойствах. Т.е. создаем что-то по назначению напоминающее глобальную переменную.
Если в каком-либо методе объявим

C#
1
ShowStudList data = new ShowStudList();

то это будет совсем другая data.
Поэтому, чтобы использовать ту, общую data в методе инициализируем ее так:

C#
1
data = new ShowStudList();

Добавлено через 5 минут

Цитата
Сообщение от CobrDOBR
Посмотреть сообщение

Однако в списке ошибок мне выходит «Обнаружен недостижимый код»

нигде не передается ничего, кроме 1 в Operations(int x)



3



CobrDOBR

1 / 1 / 0

Регистрация: 02.05.2015

Сообщений: 15

10.02.2016, 17:49

 [ТС]

15

Вот код всей структуры.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private struct ShowStudList {
            public string file;
 
            public ShowStudList(string file)
            {
                this.file = file;
            }
 
            public string[] Operations(int x)
            {
                string[] Sort = file.Split('\r');
                Array.Sort(Sort);
                for (int a = 0; a < Sort.Length; a++)
                    Sort[a] = Sort[a].Trim();
                if (x == 1)
                {
                    string showlvi = "";
                    for (int a = 0; a < Sort.Length; a++)
                        showlvi += Sort[a] + "\r";
 
                    string[] showlvi1 = showlvi.Split('.');
                    return showlvi1;
                }
                else if (x == 2)
                {
                    string DebptStud = "";
                    string[] studlist;
                    for (int i = 0; i < Sort.Length; i++)
                    {
                        if (Sort[i].Contains("2") | Sort[i].Contains(" н.") | Sort[i].Contains(".н ") | Sort[i].Contains(" н "))
                            DebptStud += Sort[i];
                        studlist = DebptStud.Split('.');
                        return studlist;
                    }
                }
                return Sort;
            }
        }

Вот в этом методе передается не только 1.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
            try {
 
                if (comboBox1.SelectedIndex == 0) {
                    StudList.Items.Clear();
                    int x = 0, y = 1, z = 2;
                    string[] showlvi2 = data.Operations(1);
                    for (int i = 0; i < (showlvi2.Length / 3); i++) {
                        ListViewItem ivi = new ListViewItem(showlvi2[x]);
                        ivi.SubItems.Add(showlvi2[y]);
                        ivi.SubItems.Add(showlvi2[z]);
                        StudList.Items.Add(ivi);
                        x += 3;
                        y += 3;
                        z += 3;
                    }
                }
                if (comboBox1.SelectedIndex == 1)
                {
                    StudList.Items.Clear();
                    int x = 0, y = 1, z = 2;
                    string[] showlvi2 = data.Operations(2);
                    for (int i = 0; i < (showlvi2.Length / 3); i++)
                    {
                        ListViewItem ivi = new ListViewItem(showlvi2[x]);
                        ivi.SubItems.Add(showlvi2[y]);
                        ivi.SubItems.Add(showlvi2[z]);
                        StudList.Items.Add(ivi);
                        x += 3;
                        y += 3;
                        z += 3;
                    }
                }
            }
            catch {
                MessageBox.Show("Не найдет файл!");
            }
        }



0



Даценд

Эксперт .NET

5868 / 4745 / 2940

Регистрация: 20.04.2015

Сообщений: 8,361

10.02.2016, 19:15

16

CobrDOBR,
вот здесь:

C#
1
2
3
4
5
6
7
for (int i = 0; i < Sort.Length; i++)
{
    if (Sort[i].Contains("2") | Sort[i].Contains(" н.") | Sort[i].Contains(".н ") | Sort[i].Contains(" н "))
        DebptStud += Sort[i];
    studlist = DebptStud.Split('.');
    return studlist;
}

В конце первой же итерации return studlist делает выход из метода Operations. Второй итерации цикла не будет никогда. Поэтому код недостижимый.



2



1 / 1 / 0

Регистрация: 02.05.2015

Сообщений: 15

10.02.2016, 21:20

 [ТС]

17

Чувствую себя идиотом. Спасибо большое тебе!



1



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)**;
}

В чем проблема?

  • Windows forms для visual studio 2022
  • Windows forms visual studio mac os
  • Windows forms как создать новую форму
  • Windows forms windows media player
  • Windows form как открыть панель элементов