【问题标题】:Passing variables from main form to input form将变量从主表单传递到输入表单
【发布时间】:2010-11-28 19:47:16
【问题描述】:
我有一个简单的问题。我有一个主表单,然后是一个启动表单,我可以从中选择一个新的 3D 模型来生成。从启动表单中选择新的 3D 模型时,我想首先检查我之前处理的模型是否已保存。我只是想使用委托将一个布尔值从主窗体传递给启动窗体,但我似乎无法访问主窗体或其任何变量。我认为这很简单:frmMain myForm = new frmMain();,但在智能感知中键入 frmMain 不会显示任何内容。
有什么提示吗?
【问题讨论】:
标签:
winforms
forms
delegates
argument-passing
【解决方案1】:
在主窗体上添加公共属性
public bool IsDirty
{
get;set;
}
然后您可以在启动表单中访问this.ParentForm.IsDirty,
记得在显示启动表单时传递对主表单的引用...startupForm.showDialog(this);
【解决方案2】:
启动表单无法访问您的主表单。您必须将其存储到您想要使用它的地方可以访问的地方。
您也可以通过以下方式(以及其他方式:)
// This class is mainly used to transfer values in between different components of the system
public class CCurrent
{
public static Boolean Saved = false;
}
确保你把这个类放在两个表单都可以访问的命名空间中。
现在在您的 frmMain 表单中设置 CCurrent.Saved 的值并在您的启动表单中访问它。
【解决方案3】:
这是我的建议:
在主窗体中放置一个 3DModel 对象属性:
private Model _model;
将您的启动表单声明为对话框(如 OpenFileDialog)并执行以下操作:
public void OpenModel()
{
using(var frm=new StartUpForm())
{
if(frm.ShowDialog()==DialogResult.OK))
{
if(_model.IsDirty)
{
if(MessageBox.Show("Model is changed do you want to save it?","",MessageBoxButtons.YesNo)==DialogResult.Yes)
_model.Save();
_model=frm.SelectedModel;
}
}
}
}
你的启动表单应该有这样的界面:
public interface IStartupForm:IDisposable
{
DialogResult ShowDialog(IWin32Window parent);
Model SelectedModel{get;}
}