将数据从表格B传递到表格A不起作用

时间:2019-03-02 18:32:26

标签: c# .net winforms

问题
我有一个程序可以为用户打开一个新表单,供他们输入一些数据,然后,我试图将该数据从该表单传递到原始表单。
我浏览了文档,类似的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
    }
}

提前谢谢!
美分

2 个答案:

答案 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