Свойство в классе формы Windows Forms, доступное только после события Load - PullRequest
1 голос
/ 02 марта 2010

Я создаю экземпляр и вызываю форму B из формы A. FormB имеет некоторые настраиваемые свойства, которые позволяют мне передавать такие вещи, как sqlAdaptors и экземпляры набора данных.

Когда я создаю экземпляр и показываю форму B из формы A в виде диалоговой формы с оператором Using, все это прекрасно работает, но я считаю, что переданные мне свойства недоступны в форме B, пока не произойдет событие form_load.

У меня сложилось впечатление, что свойства, передаваемые экземпляру класса, должны быть доступны из конструктора, но это не так. Если он пытается получить доступ к свойствам до события загрузки формы, я получаю исключение нулевой ссылки.

Это правильное поведение?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2010

Если вы делаете

FormB frm = new FormB();      ' Constructor runs now
frm.MyProperty = "whatever";  ' Now you set the property
frm.ShowDialog()

Очевидно, вы запускаете конструктор, прежде чем установить свойство! Вы не можете получить доступ к свойству, пока не установите его.

0 голосов
/ 02 марта 2010

Переместить всю инициализацию внутренней переменной формы B в ее конструктор

Вот как будет выглядеть ваша форма A. Он имеет 2 кнопки: одна просто инициализирует экземпляр formb и вызывает публичное свойство. Другая кнопка отображает форму B. Form_load вызывается только тогда, когда вы показываете форму пользователю с помощью вызовов Show () или ShowDialog ().

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace formload
{
    public partial class FormA : Form
    {
        public FormA()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FormB frm = new FormB();
            MessageBox.Show(frm.MyProperty);
            frm = null;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            FormB frm = new FormB();
            frm.ShowDialog();
            MessageBox.Show(frm.MyProperty);
            frm = null;
        }
    }
}

Вот как будет выглядеть formb:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace formload
{
    public partial class FormB : Form
    {
        public FormB()
        {
            InitializeComponent();
            myPropString = "Default set via constructor";
        }

        private void FormB_Load(object sender, EventArgs e)
        {
            myPropString = "Set from form load";
        }

        private string myPropString;

        public string MyProperty
        {
            get { return myPropString; }
            set { myPropString = value; }
        }

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...