Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

Есть главная форма, посредством нажатии на кнопку на ней я через диалог помещаю на нее пользовательский элемент, который сам и создал. В элементе присутствует кнопка, открывающая еще один диалог, в котором я задаю параметры для еще одного пользовательского элемента, который я хочу поместить в уже созданный ранее на форме, но по нажатии на кнопку "создать" в диалоге создания последнего элемента, вылетает ошибка "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 в 13:20. Причина: Выкладываю проект
quri4ever вне форума Ответить с цитированием
Старый 27.05.2019, 12:27   #2
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

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

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

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

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

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

Код какой то дичайший. Вы сами придумывали логику приложения?? И что пытались добиться??
Кто научил так пользоваться 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, 22:26   #8
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

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

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

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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