问题
我有一个程序可以为用户打开一个新表单,供他们输入一些数据,然后,我试图将该数据从该表单传递到原始表单。
我浏览了文档,类似的SO问题,但最终陷入了绝望,很可能一团糟。
我的尝试
形成代码的一部分
<uses-permission android:name="android.permission.INTERNET"/>
表格B
private void addevid_Click(object sender, EventArgs e)
{
Form frm = new add_thing();
if(frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
//do things while using the input
Console.WriteLine(path); //for debugging reasons
}
}
提前谢谢!
美分
答案 0 :(得分:1)
感谢@TnTinMn,让我意识到了这个愚蠢的错误,这是将来任何人看到的功能代码:
形成代码的工作部分
#include <typeindex>
表格B工作代码
private void addevid_Click(object sender, EventArgs e)
{ add_thing frm = new add_thing();
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
Console.WriteLine(frm.piccpath1); //It works!!
}
}
答案 1 :(得分:1)
这是一种可能的方法,可能不是从 greatst 的一种方法,它从另一个Form({{}中读取一个Form(此处为名为add_thing
的Form)中设置的属性的值。 1}})。
由于在FormA
中创建了FormA
的新实例,因此可以订阅其add_thing
事件,该事件将在表单即将关闭时引发,在设置FormClosing()
之前。
请注意,事件是使用Lambda订阅的:DialogResult
。
如果您对此语法不满意,当然可以使用标准事件处理程序。
我建议
frmAddThing.FormClosing += (obj, evt) => { }
事件来处理此交换,因为FormClosing
使您有机会取消活动, 因此如果需要,表格不会关闭。由于对话框不知道如何使用这些路径,因此,例如,您有第二次机会显示通知。
在事件处理程序中,我们可以在关闭表单之前读取公共属性的值。
如果FormClosingEventArgs
的结果为add_thing
,则对更新后的值进行处理。
另一种可能更好的方法是使用INotifyPropertyChanged接口来通知订阅者属性值已更改。
或类似的东西,如您在此问题中看到的那样:
How can I make the value of a variable track the value of another
无论如何,这些可以是适用于当前类的修改,而无需更改已有的大部分内容:
在DialogResult.OK
(呼叫者)中:
FormA
以public partial class FormA : Form
{
string frmAddThingPath1 = string.Empty;
string frmAddThingPath2 = string.Empty;
string frmAddThingDescription = string.Empty;
private void addevid_Click(object sender, EventArgs e)
{
add_thing frmAddThing = new add_thing();
frmAddThing.FormClosing += (obj, evt) => {
this.frmAddThingPath1 = frmAddThing.piccpath1;
this.frmAddThingPath2 = frmAddThing.piccpath2;
this.frmAddThingDescription = frmAddThing.description;
//If something is wrong with these paths, you can set
//e.Cancel = true and notify to 'start again'
};
ClearDialogResults();
if(frmAddThing.ShowDialog() == DialogResult.OK) {
//On Form closed, do something with the results
Console.WriteLine(this.frmAddThingPath1);
}
frmAddThing.Dispose();
}
private void ClearDialogResults()
{
frmAddThingPath1 = string.Empty;
frmAddThingPath2 = string.Empty;
frmAddThingDescription = string.Empty;
}
}
格式:
add_thing