我正在尝试获取一个返回父窗体的值,下面是我正在使用的代码,它正常工作,直到开始在面板控件中加载子窗体以避免弹出窗口。
包含Panel
的mainform中的代码MainMovement child = new MainMovement(new_dat, required_time, number);
child.TopLevel = false;
this.pnlmain.Controls.Add(child);
child.Show();
child.BringToFront();
///Obtaining value back from the child form
string updatingc = child.updatestatus; //This is not working, I am proceeding with some more functions depending on this value, but code does not work here after
子表单的公共值为updatestatus,它在关闭子表单之前设置值。
请告知如何获得此值。我认为这与将child.ShowDialog()
更改为child.Show()
有关。 (为了将表单加载到面板中,我必须更改它,然后才能正常工作)。
答案 0 :(得分:2)
您可以通过构造函数将主窗体的对象传递给子窗体。如果您传递了对象,则可以访问子项中父表单的所有方法。您可以调用主类的任何公共方法来更新您的值。
MainMovement child = new MainMovement(this,new_dat, required_time, number);
child.TopLevel = false;
this.pnlmain.Controls.Add(child);
child.ShowDialog();
child.BringToFront();
在主表单中放置一个公共方法,
Public void UpdateValue(String pString)
{
// Update your value
}
在您的子表单中,您必须使用全局对象捕获“this”。
private oMainForm as MainForm
public void MainMovement(MainForm pObject,String new_dat, String required_time, Int number)
{
oMainForm = pObject;
// Your Code
}
现在,您只需从子表单中调用“ UpdateValue ”方法即可。
oMainForm.UpdateValue("Updated String");
答案 1 :(得分:1)
问题是.ShowDialog()
在继续之前等待DialogResult
,而Show()
只显示表单并继续。很难说不知道你的子表单是如何工作的,但我的猜测是你的子表单中的任何更新或集updatestatus
在代码到达该行之前都不会更新。
一种可能的解决方案是对代码进行重大重构。您可以在更改updatestatus
时触发的MainMovement表单中添加事件
请注意,我已将您的updatestatus
更改为UpdateStatus
并将其转换为属性
public MainMovement : Form
{
public event EventHandler Updated;
private void OnUpdateStatus()
{
if (Updated != null)
{
Updated(this, new EventArgs());
}
}
private String updatestatus;
public String UpdateStatus
{
get { return updatestatus; }
private set
{
updatestatus = value;
OnUpdateStatus();
}
}
// rest of your child form code
}
public ParentForm : Form
{
public void MethodInYourExample()
{
// other code?
MainMovement child = new MainMovement(new_dat, required_time, number);
child.Updated += ChildUpdated;
child.TopLevel = false;
this.pnlmain.Controls.Add(child);
child.Show();
child.BringToFront();
}
void ChildUpdated(object sender, EventArgs e)
{
var child = sender as MainMovement;
string updatingc = child.UpdateStatus;
//rest of your code
}
}