在决定提问之前,我已经对这个问题进行了一些研究。我找不到任何帮助我的东西。
我正在用C#为紧凑框架2.0编写一个应用程序。
我需要在form1上实例化一个数据对象,并将该对象传递给form2。在form2中处理数据对象,然后将该数据传递回form1,以便保存它。
我理解表单只是一个对象,我也理解对象是通过引用过去而不是通过值。我也理解这两种类型之间的区别。我出于某种原因无法使其发挥作用。
实现此目的的代码中最好,最干净的方法是什么?
答案 0 :(得分:4)
你需要做的是为你的第二个表单创建第二个构造函数,它接受一个对象作为参数...对于我所关心的所有,它可能是整个Form1对象实例,然后你可以从中获得你想要的任何东西。以第二种形式保留此对象,并根据需要对其进行修改。完成第二个表单后,您的第一个表单将包含该数据,并且您可以在第二个表单关闭后执行“刷新”。
public partial class YourSecondForm : Form
{
object PreserveFromFirstForm;
public YourSecondForm()
{
... its default Constructor...
}
public YourSecondForm( object ParmFromFirstForm ) : this()
{
this.PreserveFromFirstForm = ParmFromFirstForm;
}
private void YourSecondFormMethodToManipulate()
{
// you would obviously have to type-cast the object as needed
// but could manipulate whatever you needed for the duration of the second form.
this.PreserveFromFirstForm.Whatever = "something";
}
}
答案 1 :(得分:2)
我一直很喜欢这种事件模型。这样,您的表单无需了解其他任何人。您可以在两种表单使用的某种EventHandler类中设置如下所示的事件。
public delegate void SavingObjectHandler(MyObject obj);
public event SavingObjectHandler SavingObjectEvent;
public void SavingObject(MyObject obj)
{
if (SavingObjectEvent != null) SavingObjectEvent(obj);
}
然后你的一个表单可以调用SavingObject甚至处理程序,另一个表单可以订阅SavingObjectEvent。当第一个表单触发事件时,将通知第二个表单执行它需要的处理,然后在操作之后该对象将再次可用于第一个表单。
答案 2 :(得分:0)
类似这样的东西,ObservableForm是一个基类,并包含ChangeEvent以进一步提高灵活性:
public class FormMain : Form
{
private ObServableForm childForm = null;
public FormMain () {
this.childForm = new ObservableFormConcreateA(this);
this.childForm.ChangeEvent += (sender, e) => Application.DoEvents();
}
public void Present() {
this.childForm.Show();
}
}
public class ObservableFormConcreateA ObServableForm
{
private Form workItemForm = null;
private delegate void FormChangedHandler(object source, EventArgs args);
//ToDo: this should go in the superclass
public event FormChangedHandler ChangeEvent;
public FormChild(ObServableFormworkItem) {
this.workItemForm = workItem;
}
public void OnUserActionHandler(object sender, EventArgs e) {
this.formItemForm.Property = this.txtBoxWhateverValue.Text;
if(ChangeEvent != null)
ChangeEvent(this, //create your args to specify which control/data changes);
}
}
答案 3 :(得分:0)
我有一个有趣的解决方案,涉及关闭。在Form2的构造函数中,需要一个Action<TypeOfThing>
对象,每当需要将数据返回到Form1时,调用该Action并将数据传递给它。例如:
class Form1 : Form
{
private void SomeFunction()
{
TypeOfData data;
Form2 form2 = new Form2((d) => { data = d; });
form2.ShowDialog() // or whatever you do with form2
// After you've definitely got your data object from Form2
DoStuff(data);
}
}
class Form2 : Form
{
private Action<TypeOfData> returnData;
private TypeOfData data;
public Form2(Action<TypeOfData> r)
{
returnData = r;
}
private void SomeFunction()
{
// Whenever it comes time to return the data you've collected
returnData(data);
}
}
我在以下情况下使用过这个实现:我不得不向用户请求密码,我想用一个对话框来设置密码,所以我设计了一个带有文本框的对话框,用户可以在其中键入密码,以及确定和取消按钮。在FormClosing上,我通过调用Action返回字符串(他们的密码),我只会将该Form用作对话框,因此我可以确保在代码继续时将变量分配给字符串Form1上。这样我就不必为密码创建一个属性,这是没有意义的,因为密码只是暂时必需的数据。