Унаследованная форма WinForms не может видеть переменные родителя - PullRequest
0 голосов
/ 31 января 2011

Я пытаюсь использовать переменную в родительской форме для хранения переменной.Код для родительской формы выглядит следующим образом:

public partial class Form1 : Form
{
    internal string testVar;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        testVar = "button1";
        MessageBox.Show("testVar = " + testVar);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Form2 newfrm = new Form2();
        newfrm.Show();
    }
}

Таким образом, если пользователь нажимает кнопку 1, он устанавливает для переменной значение «кнопка 1».Нажатие кнопки 2 запускает дочернюю форму, определенную следующим образом:

public partial class Form2 : Form1
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        MessageBox.Show(base.testVar);
    }
}

Итак, кнопка 3 показывает значение внутренней переменной в родительской форме.Тем не менее, он пуст (независимо от того, установлен он или нет).Почему дочерняя форма не может видеть значения в родительском?

Ответы [ 3 ]

1 голос
/ 31 января 2011

Ваш код не имеет доступа к родительской форме! Вы используете base.testVar, который обращается к переменной в текущем объекте, унаследованной от базового класса , но не от Form1 экземпляра , который создал экземпляр Form2! 1008 *

Может быть, вы хотите что-то вроде следующего:

public partial class Form1 : Form
{
    ...
    private void button2_Click(object sender, EventArgs e)
    {
        Form2 newfrm = new Form2();
        newfrm.ParentForm = this;
        newfrm.Show();
    }
}

public partial class Form2 : Form1
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button3_Click(object sender, EventArgs e)
    {
        string v = (ParentForm != null) ? ParentForm.testVar : "<no parent set>";
        MessageBox.Show(v);
    }
    public Form1 ParentForm;
}

(Ну, вам понадобится лучшая защита для ParentForm.)

1 голос
/ 31 января 2011

Потому что экземпляры формы Parent и Child имеют свои копии.

Это должно сработать (и объяснить это):

private void button2_Click(object sender, EventArgs e)
 {
        Form2 newfrm = new Form2();
        newFrm.testVar = this.testVar;
        newfrm.Show();
}
0 голосов
/ 31 января 2011

Это два отдельных экземпляра. Одним из них является ваша основная форма, экземпляр Form1, для переменной testVar которой установлено значение. Другая - это вторичная форма, экземпляр Form1, который наследуется от Form1, но его testVar переменная не установлена.

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