自己学编程也一段时间了,但是一直没有在网络上写什么文章。前段时间一直都在研究窗体间传值的问题,在这期间得到了一些感悟,现在和大家分享一下。或许会比较肤浅,还请大家见谅。更请各路老鸟指出错误和建议。
有做过窗体间传值的就知道,窗体间传值的方法不下下面这几种:
1、 公开控件属性;
2、 传递窗体对象或控件的引用;
3、 使用委托。
但是不知道大家是否发现了一个本质不变的东西,那就是无论是何种方法,都是通过在实例中获取对方实力的全部或者部分的引用。并以此来操纵或者获取对方的数据。由此我们可以闭上眼睛,想象一下:在内存区的堆中有这样两个存储区,分别存储着两个窗体对象。每个窗体对象各有自己的属性、方法和事件。不妨假设要获取数据的是subForm窗体,提供数据是mianForm窗体。由于subForm、mainForm是两个独立的实体,它们各自没有相应的联系通道。为此,我们是否应该为它们创建这样一个条件呢?
由此,我们在subForm窗体中添加一个到mainForm窗体的引用。该引用就成为了连接两个窗体的通道。通过这个通道,subForm窗体就可以操控mainForm窗体中的数据了。下面我们创建mainForm、subForm两个窗体:
public delegate string GetText();
public delegate void SetText(string text);
class MainForm :form
{
SubForm subForm;
public MainForm()
{
InitializeComponent();
}
/// <summary>
/// 用于子窗体修改主窗体的值,提供给子窗体控制主窗体的操作
/// </summary>
/// <param name="text">从子窗体中获取的值</param>
private void SetTextValue(string text)
{
tbText.Text = text;
}
/// <summary>
///用于子窗体从主窗体中获取值
/// </summary>
/// <returns>子窗体从主窗体中获取的值</returns>
private string GetTextValue()
{
return tbText.Text;
}
private void btnOK_Click(object sender, EventArgs e)
{
//通过委托来进行两个窗体的互操作
//传递给子窗体的引用,以此建立两窗体间的联系
//subForm = new SubForm(this.GetTextValue, this.SetTextValue);
//通过给子窗体传递主窗体对象的引用来建立联系
subForm = new SubForm(this);
subForm.ShowDialog();
}
}
class SubForm : Form
{
private GetText getTextValue = null;
private SetText setTextValue = null;
private MainForm mainForm = null;
public SubForm(GetText getText,SetText setText)
{
InitializeComponent();
this.getTextValue = getText;
this.setTextValue = setText;
this.tbText.Text = this.getTextValue();
}
public SubForm(MainForm mainForm)
{
InitializeComponent();
this.mainForm = mainForm;
}
private void btnOK_Click(object sender, EventArgs e)
{
this.setTextValue(this.tbText.Text);
}
}
上面是通过委托和传递对象引用来实现的。但是其思想却是一样的——通过对象引用来实现对象间的互操作。