Как я передаю значение от ребенка назад к родительской форме?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
47
задан abatishchev 18 May 2012 в 10:47
поделиться

7 ответов

Создайте свойство (или метод) на FormOptions, скажите GetMyResult:

using (FormOptions formOptions = new FormOptions())
{
    formOptions.ShowDialog();

    string result = formOptions.GetMyResult;

    // do what ever with result...
}
60
ответ дан Mitch Wheat 26 November 2019 в 19:20
поделиться

, Если Вы просто используете formOptions, чтобы выбрать единственное значение и затем закрыться, предложение Mitch является хорошим способом пойти . Мой пример здесь использовался бы при необходимости в ребенке для передачи назад с родителем, оставаясь открытыми.

В Вашей родительской форме, добавьте открытый метод, который дочерняя форма назовет, такой как

public void NotifyMe(string s)
{
    // Do whatever you need to do with the string
}

Затем, когда необходимо будет запустить дочернее окно от родителя, используйте этот код:

using (FormOptions formOptions = new FormOptions())
{
    // passing this in ShowDialog will set the .Owner 
    // property of the child form
    formOptions.ShowDialog(this);
}

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

ParentForm parent = (ParentForm)this.Owner;
parent.NotifyMe("whatever");

код в этом примере лучше использовался бы для чего-то как окно панели инструментов, которое предназначается для плавания выше основной формы. В этом случае Вы открыли бы дочернюю форму (с.TopMost = верный) использующий.Show () вместо.ShowDialog ().

дизайн А как это означает, что дочерняя форма сильно связывается к родительской форме (так как ребенок должен снять ее владельца в качестве ParentForm для вызова ее метода NotifyMe). Однако это не автоматически плохая вещь.

33
ответ дан MusiGenesis 26 November 2019 в 19:20
поделиться

Можно также создать общественную собственность.

// Using and namespace...

public partial class FormOptions : Form
{
    private string _MyString;    //  Use this
    public string MyString {     //  in 
      get { return _MyString; }  //  .NET
    }                            //  2.0

    public string MyString { get; } // In .NET 3.0 or newer

    // The rest of the form code
}

Тогда можно получить его с:

FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();

string myString = formOptions.MyString;
23
ответ дан stiduck 26 November 2019 в 19:20
поделиться

Можно также создать перегрузку ShowDialog в дочернем классе, который добирается параметр, который возвращает Вас результат.

public partial class FormOptions : Form
{
  public DialogResult ShowDialog(out string result)
  {
    DialogResult dialogResult = base.ShowDialog();

    result = m_Result;
    return dialogResult;
  }
}
9
ответ дан MusiGenesis 26 November 2019 в 19:20
поделиться

Используйте общественную собственность дочерней формы

frmOptions {
     public string Result; }

frmMain {
     frmOptions.ShowDialog(); string r = frmOptions.Result; }

события Use

frmMain {
     frmOptions.OnResult += new ResultEventHandler(frmMain.frmOptions_Resukt);
     frmOptions.ShowDialog(); }

общественная собственность Использования основной формы

frmOptions {
     public frmMain MainForm; MainForm.Result = "result"; }

frmMain {
     public string Result;
     frmOptions.MainForm = this;
     frmOptions.ShowDialog();
     string r = this.Result; }

Управление объектом Использования. Тег; Это характерно для всей общественной собственности средств управления, которая может содержать Систему. Объект. Можно держать там строку или MyClass или MainForm - что-либо!

frmOptions {
     this.Tag = "result": }
frmMain {
     frmOptions.ShowDialog();
     string r = frmOptions.Tag as string; }
3
ответ дан abatishchev 26 November 2019 в 19:20
поделиться

Многими способами освежевать кошку здесь и предложение @Mitch является хороший путь. Если Вы хотите, чтобы клиентская форма имела больше 'контроля', можно хотеть передать экземпляр родителя ребенку, когда создано, и затем можно назвать любой общедоступный родительский метод на ребенке.

0
ответ дан Community 26 November 2019 в 19:20
поделиться

Я думаю, что самый легкий путь состоит в том, чтобы использовать Свойство тегов в Вашем классе FormOptions, устанавливает Тег =, оценивают Вас, должен передать и после того, как метод ShowDialog считал его как

myvalue x=(myvalue)formoptions.Tag;
0
ответ дан abatishchev 26 November 2019 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: