Как передать значение из дочернего элемента обратно в родительскую форму? У меня есть строка, которую я хотел бы передать родительскому.
Я запустил ребенка, используя:
FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();
Как передать значение из дочернего элемента обратно в родительскую форму? У меня есть строка, которую я хотел бы передать родительскому.
Я запустил ребенка, используя:
FormOptions formOptions = new FormOptions();
formOptions.ShowDialog();
Создайте свойство (или метод) на FormOptions
, скажем GetMyResult
:
using (FormOptions formOptions = new FormOptions())
{
formOptions.ShowDialog();
string result = formOptions.GetMyResult;
// do what ever with result...
}
Если вы просто используете 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 = true), используя .Show() вместо .ShowDialog().
Конструкция, подобная этому, означает, что дочерняя форма тесно связана с родительской формой (так как дочерний элемент должен передать своего владельца в качестве ParentForm, чтобы вызвать его метод NotifyMe). Однако это не так уж и плохо.
Вы также можете создать публичное свойство.
// 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;
Вы также можете создать перегрузку ShowDialog в своем дочернем классе, который получает параметр out, который возвращает результат.
public partial class FormOptions : Form
{
public DialogResult ShowDialog(out string result)
{
DialogResult dialogResult = base.ShowDialog();
result = m_Result;
return dialogResult;
}
}
Использовать общедоступное свойство дочерней формы
frmOptions {
public string Result; }
frmMain {
frmOptions.ShowDialog(); string r = frmOptions.Result; }
Использовать события
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; }
Использовать объект Control.Tag; Это является общим для всех элементов управления public, которые могут содержать System.Object. Вы можете держать там строку или MyClass или MainForm - ничего!
frmOptions {
this.Tag = "result": }
frmMain {
frmOptions.ShowDialog();
string r = frmOptions.Tag as string; }
Ну, я только что столкнулся с той же проблемой - может быть, немного иначе. Однако, я думаю, именно так я решил это:
в моей родительской форме я объявил дочернюю форму без экземпляра, например. RefDateSelect myDateFrm;
Так что это доступно для моих других методов в этом классе/форме
next, метод отображает дочерний элемент по новому экземпляру:
myDateFrm = new RefDateSelect();
myDateFrm.MdiParent = this;
myDateFrm.Show();
myDateFrm.Focus();
мой третий метод (который хочет получить результаты от ребенка) может прийти в любое время и просто получить результаты:
PDateEnd = myDateFrm.JustGetDateEnd();
pDateStart = myDateFrm.JustGetDateStart();`
Примечание: дочерние методы JustGetDateStart()
являются общедоступными в CHILD как:
public DateTime JustGetDateStart()
{
return DateTime.Parse(this.dtpStart.EditValue.ToString());
}
Надеюсь, это поможет.
Для Picrofo EDY
Это зависит, если вы используете ShowDialog()
как способ показа формы и ее закрытия, вы используете кнопку закрытия вместо this.Close()
. Форма не будет удалена или уничтожена, она будет скрыта, и изменения могут быть сделаны после того, как они исчезли. Чтобы правильно закрыть его, вам понадобится метод Dispose()
или Close()
. С другой стороны, если вы используете метод Show()
и вы его закрываете, форма будет удалена и не может быть изменена после.
Если вы показываете дочернюю форму как модальное диалоговое окно, вы можете установить свойство DialogResult дочерней формы со значением из перечисления DialogResult, которое, в свою очередь, скрывает модальное диалоговое окно и возвращает управление вызывающей форме. В это время родитель может получить данные дочерней формы, чтобы получить необходимую информацию.
Для получения дополнительной информации проверьте эту ссылку: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult(v=vs.110).aspx
Многие способы скинуть кошку здесь и @Mitch предложение - это хороший способ. Если вы хотите, чтобы в клиентской форме было больше "контроля", вы можете передать экземпляр родителя ребенку при его создании, а затем вы можете вызвать любой открытый родительский метод для дочернего элемента.
Я думаю, что самый простой способ - использовать свойство Tag в вашем классе FormOptions задайте значение Tag =, которое необходимо передать и после метода ShowDialog прочитайте его как
myvalue x=(myvalue)formoptions.Tag;
Когда вы используете метод ShowDialog()
или Show()
, а затем закройте форму, объект формы не будет полностью уничтожен (закрытие!= уничтожение). Он останется в живых, только он находится в "закрытом" состоянии, и вы все еще можете что-то делать с ним.
у меня была та же проблема, я решил ее так, вот пошаговая инструкция для новичков
сначала создайте объект дочерней формы в верхней части класса, а затем используйте этот объект для каждой операции дочерней формы, например, для отображения дочерней формы и чтения значений из нее.
пример
namespace ParentChild
{
// Parent Form Class
public partial class ParentForm : Form
{
// Forms Objects
ChildForm child_obj = new ChildForm();
// Show Child Forrm
private void ShowChildForm_Click(object sender, EventArgs e)
{
child_obj.ShowDialog();
}
// Read Data from Child Form
private void ReadChildFormData_Click(object sender, EventArgs e)
{
int ChildData = child_obj.child_value; // it will have 12345
}
} // parent form class end point
// Child Form Class
public partial class ChildForm : Form
{
public int child_value = 0; // variable where we will store value to be read by parent form
// save something into child_value variable and close child form
private void SaveData_Click(object sender, EventArgs e)
{
child_value = 12345; // save 12345 value to variable
this.Close(); // close child form
}
} // child form class end point
} // name space end point