Передача значений между C # Winforms работает с перерывами - PullRequest
0 голосов
/ 31 января 2012

Я пытаюсь передать значения между несколькими winforms, у меня есть в общей сложности 6 winforms, которые пользователь будет циклически проходить. Я передаю значения между формами, используя TextBox и Label Controls.

Когда я открываю Первичную winform, затем нажимаю кнопку, чтобы загрузить вторую winform, все работает нормально (я могу передать значения в Первую форму). Моя проблема в том, что как только я направляю пользователя в другую форму и this.Hide(); текущую (2-я форма Winform), а затем пытаюсь использовать третью форму для передачи значений в первую, я получаю следующую ошибку:

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

Я запутался, потому что элемент управления, который должен передавать значение, передает значение в первую форму, а не NULL

Я использую один и тот же код для соединения всех форм.

public MainForm MainForm;

Тогда я пытаюсь передать значения следующим образом:

 MainForm.textBox1.Text = txt_FileName.Text;

Примечание. Все элементы управления TextBox и Label, передающие значения между формами, public

Кто-нибудь сталкивался с этим? Или какие-нибудь идеи? .

Ответы [ 3 ]

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

.Net 2.0 и более поздние версии имеют функцию для форм Windows, называемую «экземпляр по умолчанию», где она дает вам экземпляр с тем же именем, что и тип. Назначение этой функции - совместимость с кодом, перенесенным из старых приложений vb6. Если вы не мигрируете из старого приложения vb, обычно лучше избегать экземпляров по умолчанию. Они доставят вам неприятности, такие как у вас сейчас. Вместо этого создайте переменную для хранения экземпляров форм, которые вы создаете сами.

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

Вы должны убедиться, что все ваши формы созданы (через новую MyForm1 () ...).Простое объявление переменной типа MainForm не создаст экземпляр формы - вам придется это сделать.Я предполагаю, что одна из ваших форм еще не создана, когда вы пытаетесь получить доступ к элементу управления.

Это еще одна причина не использовать публичные элементы управления (см. Также мой комментарий), так как время жизни ваших элементов управленияпривязаны к жизни вашей формы.Лучше скрыть элементы управления от общего доступа и отправлять данные в форму через объекты данных - форма установит все эти значения для своих собственных элементов управления.Это также значительно упрощает проверку, так как значение элемента управления может быть установлено только на значения, разрешенные формой.Если вы устанавливаете управляющие значения извне, вам будет сложно проверить их во всех сценариях.

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

// Data class to set data in Form2
internal class Form2Data
{
    public string Name;
    ...
}

...

internal class Form2 : Form
{
    public static DialogResult ShowDlg ( Form2Data oData )
    {
        Form2 oFrm = new Form2 ();

        oFrm.SetData ( oData );
        DialogResult nResult = oFrm.ShowDialog ();

        if ( nResult == DialogResult.Ok )
            oFrm.GetData ( oData );

        return ( nResult );
    }

    private void SetData ( Form2Data oData )
    {
        // Set control values here
    }

    private void GetData ( Form2Data oData )
    {
        // Read control values here
    }
}

...
// You call this as such:
Form2Data oData = new Form2Data ();
oData.Name = "...";

DialogResult nResult = Form2.ShowDlg ( oData );

// after the call, oData should have updated values from Form2
if ( nResult == DialogResult.Ok )
{
    // show your next form in a similar pattern - set up data
    // call form's static method to pass it and then wait for
    // the form to finish and return with updated data.
}

Вам придется использовать аналогичный шаблон и в других ваших формах.Это требует больше работы, так как вам нужно настроить разные объекты данных для всех форм, но таким образом вы можете легко выполнить проверку до и после отображения формы (в SetData и GetData).Он также лучше инкапсулирует вашу программу, поскольку элементы управления недоступны извне.

0 голосов
/ 31 января 2012

Вы должны передать значение, используя значение экземпляра формы.

, например:

SecondForm secForm2 = new SecondForm();
secForm2.textBox1.Text = txt_FileName.Text

, поэтому, если вы передаете значение из SecondForm в ThirdForm:

ThirdForm thiForm = new ThirdForm();
thiForm.textBox1.Text = textBox1.Text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...