Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 27.05.2019, 12:48   #1
quri4ever
 
Регистрация: 01.04.2018
Сообщений: 6
Репутация: 10
По умолчанию Динамическое создание и размещение объектов на форме

Доброго времени суток, помогите, пожалуйста!

Есть главная форма, посредством нажатии на кнопку на ней я через диалог помещаю на нее пользовательский элемент, который сам и создал. В элементе присутствует кнопка, открывающая еще один диалог, в котором я задаю параметры для еще одного пользовательского элемента, который я хочу поместить в уже созданный ранее на форме, но по нажатии на кнопку "создать" в диалоге создания последнего элемента, вылетает ошибка "System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."".

Я пока только учусь, сильно не ругайтесь

Код первой формы:
Код:
namespace TrelloLike
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Form CreateColDialog = new CreateColDialog(); //Форма создания tcol
        public TColumn tcol; //элемент, который успешно создается на форме
        public TaskCard card1; //элемент, который и нужно запихнуть в tcol
        public TaskCreateDialog taskCreateDia; //диалог создания card1

        private void CreateColBtn_Click(object sender, EventArgs e)
        {
            CreateColDialog.ShowDialog(this);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void CreateColDialog_Hide(object sender, EventArgs e)
        {
            tcol = new TColumn();
        }

        private void taskCreateDia_Show(object sender)
        {
            card1 = new TaskCard();
            card1.Parent = tcol;
        }
    }
}
Код формы, где создается первый элемент (tcol):
Код:
public partial class CreateColDialog : Form
    {

        public CreateColDialog()
        {
            InitializeComponent();
        }

        public TColumn Col1;
        public Form1 f1;
        public int _number;
  
        private void CreateColDialog_Load(object sender, EventArgs e)
        {

        }

        public CreateColDialog(Form1 f)
        {

        }
        
        public void button1_Click(object sender, EventArgs e)
        {
            Button b1 = (Button)sender;

            f1 = this.Owner as Form1;

            if (f1 != null)
            {

                Col1 = new TColumn();

                int colXpos, colYpos;
                colYpos = 50;
                colXpos = 50;

            
                    Col1.Name = GroupNameType.Text;
                    Col1.label1.Text = GroupNameType.Text;
                    colXpos = Col1.Location.X + 100;
                    colYpos = Col1.Location.Y + 100;
                    f1.Controls.Add(Col1);
                    Col1.Location = new Point(colXpos, colYpos);
                    Col1.Show();

            }

            GroupNameType.Text = "";
            this.Hide();
        }
    }
Код формы, создающей последний эл-т:
Код:
public partial class TaskCreateDialog : Form
    {
        public TaskCreateDialog()
        {
            InitializeComponent();
        }

        public Form1 f;
        public TColumn tcol;
        
        public string coworkerName;
        public string taglabelText;
        public string tasklabelText;
        public Color flagColor = new Color();

        public TaskCard card1;

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void panel1_Click(object sender, EventArgs e)
        {
            colorDialog1.ShowDialog();
            flagColor = colorDialog1.Color;
            flagColorShow.BackColor = flagColor;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Button b1 = (Button)sender;

            Form1 f = this.Owner as Form1;
            TColumn tcol = new TColumn();
            tcol.Parent = f;

            if (tcol != null)
            {

                card1 = new TaskCard(); //Элемент, который я хочу разместить в элементе TColumn, уже находящемся на форме

                card1.coworkerName = coworkerNameText.Text;
                card1.taglabelText = tagLabelTextBox.Text;
                card1.tasklabelText = descriptionText.Text;
                card1._number = 1;
                card1.flagColor = flagColor;
                card1.Enabled = true;
                card1.Location = new Point(tcol.Location.X + 2, tcol.Location.Y + 20);

                card1.Show();

                f.tcol.Controls.Add(card1);
                //}
                this.Hide();
            }
        }

        private void TaskCreateDialog_Load(object sender, EventArgs e)
        {

        }
    }
Сам проект: https://yadi.sk/d/RLryAiXHGyzXsw

Закомментированные строчки - это неважно, просто в перспективе там должен создаваться не один элемент....

Последний раз редактировалось quri4ever; 27.05.2019 в 14:20. Причина: Выкладываю проект
quri4ever вне форума   Ответить с цитированием
Старый 27.05.2019, 13:27   #2
OmegaBerkut
Спокойный псих
Профессионал
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Адрес: Украина
Сообщений: 1,228
Репутация: 347
По умолчанию

Проект выложите.
В вашем коде присутствуют всякие TColumn, и не понятно что это такое.
__________________
Подпись ? Не, не слышал ...
OmegaBerkut вне форума   Ответить с цитированием
Старый 27.05.2019, 14:18   #3
quri4ever
 
Регистрация: 01.04.2018
Сообщений: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Проект выложите.
В вашем коде присутствуют всякие TColumn, и не понятно что это такое.
Выложил
quri4ever вне форума   Ответить с цитированием
Старый 27.05.2019, 16:00   #4
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,433
Репутация: 984
По умолчанию

Цитата:
Сообщение от quri4ever Посмотреть сообщение
по нажатии на кнопку
А поставить точку останова и посмотреть самостоятельно - никак?
Black Fregat вне форума   Ответить с цитированием
Старый 27.05.2019, 18:40   #5
quri4ever
 
Регистрация: 01.04.2018
Сообщений: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
А поставить точку останова и посмотреть самостоятельно - никак?
Понять бы, на что смотреть...
quri4ever вне форума   Ответить с цитированием
Старый 27.05.2019, 20:56   #6
Black Fregat
Программист
Профессионал
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,433
Репутация: 984
По умолчанию

Цитата:
Сообщение от quri4ever Посмотреть сообщение
Понять бы, на что смотреть...
При ошибке NullReferenceException смотреть, что у нас внезапно оказалось null
А для начала хотя бы оператор локализовать, на котором падает - уже многое понятно станет
Black Fregat вне форума   Ответить с цитированием
Старый 27.05.2019, 21:08   #7
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 2,210
Репутация: 617

icq: 359393755
По умолчанию

Код какой то дичайший. Вы сами придумывали логику приложения?? И что пытались добиться??
Кто научил так пользоваться Owner? Владелец то разный а вы требуете чтобы всегда был Form1. При создании задачи владельца у кнопки вообще нету.
Вам точно нужно возвращаться на этап постановки задачи и проектирования.

вот в коде:
Код:
public partial class TColumn : UserControl
    {
      ....

        private void button1_Click(object sender, EventArgs e)
        {
            taskCreate = new TaskCreateDialog();

            //taskCreate.Show();  <--  ТУТ НАДО ВЛАДЕЛЬЦА В ПАРАМЕТРЕ ЗАДАТЬ 
            taskCreate.Show(this); например так
            card1 = new TaskCard();
        }
}

public partial class TaskCreateDialog : Form
    {
        private void button1_Click(object sender, EventArgs e)
        {
            Button b1 = (Button)sender;

            Form1 f = this.Owner as Form1; <-- Но класс владельца будет не Form1 а TColumn

        }
    }
А если нужно прям форм1 то вам ее прокидывать надо по всему пути создания контролов.

Вам нужен какой то общий класс формы который может являться контейнером для всех дочерних форм или контролов. В любом случае продумать логику надо детальнее.
__________________
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster вне форума   Ответить с цитированием
Старый 27.05.2019, 23:26   #8
OmegaBerkut
Спокойный псих
Профессионал
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Адрес: Украина
Сообщений: 1,228
Репутация: 347
По умолчанию

Как у формы будет задан Owner, если форма создаётся из вашего класса TColumn ? На скрине во вложении показано, что this.Owner равен null.
Через все классы нужно протягивать ссылку на экземпляр вашего Form1.
После этого ещё выясняется, что (owner as Form1).tcol ещё не создан, а код его создания находится в функции скрытия дочерней формы.
Приложил проект с исправлениями. Но архитектура здесь не продуманная.
Изображения
 
Вложения
Тип файла: zip Trello YXUNGproject.zip (817.2 Кб, 7 просмотров)
__________________
Подпись ? Не, не слышал ...
OmegaBerkut вне форума   Ответить с цитированием
Старый 27.05.2019, 23:28   #9
OmegaBerkut
Спокойный псих
Профессионал
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Адрес: Украина
Сообщений: 1,228
Репутация: 347
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
А поставить точку останова и посмотреть самостоятельно - никак?
Зачем точка останова ? При выпадании исключения студия сама показывает, что не понравилось отладчику
Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Владелец то разный
В том то и дело, что владелец не разный. Его там просто нет. Отсюда и NullReference. Потому что форма создаётся из класса TColumn, что само по себе дикость.
__________________
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 27.05.2019 в 23:31.
OmegaBerkut вне форума   Ответить с цитированием
Старый 28.05.2019, 11:30   #10
quri4ever
 
Регистрация: 01.04.2018
Сообщений: 6
Репутация: 10
По умолчанию

Цитата:
В том то и дело, что владелец не разный. Его там просто нет. Отсюда и NullReference. Потому что форма создаётся из класса TColumn, что само по себе дикость.
Так а откуда тогда, если кнопка создания по задумке должна быть именно в эл-те TColumn? А this.Owner = TColumn прописать никак не выйдет, выдает ошибку, ибо это не форма и такого определения этот элемент не поддерживает..
quri4ever вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое создание объектов Magnetic Air Microsoft Office Excel 4 21.11.2016 10:37
Динамическое создание объектов Костян Пират Общие вопросы Delphi 12 24.05.2011 18:39
Что менее затратно: создание кодом или размещение на форме компонента? MyLastHit Общие вопросы Delphi 12 25.12.2010 15:09
Динамическое создание объектов panda88 Общие вопросы Delphi 4 24.01.2010 19:16
Динамическое создание объектов LepihinMS Общие вопросы Delphi 18 05.07.2007 23:31


12:35.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru