1-4 多文档界面处理(2)

简介:

1-4-3 多文档界面的窗体传值技术

1.简介

一般在一个Windows开发项目系统之中,多文档窗口(MDI)只有一个,而其余的窗口为非MDI窗口,在设定窗口的父子关系时候,需要指定这些非MDI窗口的MDI父窗口为当前的MDI主窗口,为其如此打开的子窗口才可以收到父窗口的限制。
我们在窗口系统开发中,都会或多或少的存在着打开的子窗口彼此之间进行数据传接的问题,即多文档界面的窗体传值技术。

2 案例学习:利用窗体参数定义进行传值

本次实验目标是首先建立一个MDI主窗体和两个子窗体,并实现打开某个窗体并录入信息后,可以将信息显示在另一个窗体之中。最终显示界面如图1-23所示。
1-23   子窗体传递数据信息目标
u   实验步骤(1):
在多文档的建立案例的基础之上(见1-2-3节的第2部分),通过单击菜单项的 “窗口1”打开图1-23的第一个子窗口,该窗口命名为Form2,请读者自行按照图内各个控件进行属性设计工作。将Form2ComboBox1下拉框填充完毕后,双击窗体界面进入Form2窗体的Load事件编辑工作:
小实验: Form2窗体的初始化源代码:
private  void Form2_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 0;
            textBox3.Text = "";
            textBox1.Focus();
}
u   实验步骤(2):
如图1-23所示,建立表单窗体Form3,并按图为该表单建立相应的控件以接收来自Form2的数据信息。回到表单窗体Form2,用鼠标双单击Button1发送按钮,开始将用户填写的信息提交给Form3窗体。代码如下所示:
小实验: Form2窗体Button1(发送)按钮的鼠标单击事件源代码:
public  void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "" || textBox2.Text == "")
            {
                MessageBox.Show("姓名,或者邮件信息禁止为空!""信息提示");
            }
            else
            {
                this.Hide();
                Form3 childForm3 = new Form3(this.textBox1.Text, this.textBox2.Text, this.comboBox1.SelectedItem.ToString());
                childForm3.Show();
            }
}
我们看见在上面代码之中的黑体字部分,在实例化下一个窗体Form3时,是将Form3窗体进行了参数的配置,即希望实例化Form3窗体的同时将这三个参数(姓名,邮件,主题)传接过去。因此,必须在Form3窗体的.cs文件之中,对Form3窗体进行明确的参数定义。代码见下:
小实验: Form3窗体的定义及方法事件源代码:
public  partial class Form3 : Form
        {
            private string _name;
            private string _emailId;
            private string _subject;
            private string _feedBack;
            //注意:在对Form3定义时候,明确指定了相关的参数。
            public Form3(string varName, string varEmail, string varSubject, string varFeedBack)
            {
                InitializeComponent();
                // 在 private 变量中存储值
                this._name = varName;
                this._emailId = varEmail;
                this._subject = varSubject;
                this._feedBack = varFeedBack;
                // 在列表框中放置实例化后传来的参数值
                listBox1.Items.Add("姓名:" + this._name);
                listBox1.Items.Add("邮件地址:" + this._emailId);
                listBox1.Items.Add("信息主题:" + this._subject);
                listBox1.Items.Add("反馈意见:" + this._feedBack);
            }
            //定义了关闭按钮鼠标单击事件
            private void button1_Click(object sender, EventArgs e)
            {
                MessageBox.Show("感谢您输入的反馈!");
                this.Close();
            }
}

3案例学习:在子窗体转换的过程中如何确保受到MDI主窗口的控制

我们继续改进本节第一个案例学习的内容,并在Form3窗口添加一个返回的按钮。界面如图1-24所示。
1-24   添加返回按钮的 Form3 窗口
u   实验步骤(1):
 
添加返回按钮的代码,如下所示:
小实验:Form3窗体的返回按钮鼠标单击事件源代码:
private  void button1_Click_1(object sender, EventArgs e)
        {
            Form2 fm2 = new Form2();
            Fm2.Show();
            this.Close();
  }
问题讨论: 我们会发现,返回的窗体Form2不再受到主MDI窗体的控制,跑到主MDI窗体之外了。同样情况,当窗体Form2通过“发送”按钮打开窗体Form3的时候,Form3也不再受到主MDI窗体的控制。如何解决所有打开的子窗体都必须受到主MDI窗体的控制呢?
小实验: 更改Form2窗体Button1(发送)按钮的鼠标单击事件源代码:
public  void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "" || textBox2.Text == "")
            {
                MessageBox.Show("姓名,或者邮件信息禁止为空!""信息提示");
            }
            else
            {
                this.Hide();
                Form3 childForm3 = new Form3(this.textBox1.Text, this.textBox2.Text, this.comboBox1.SelectedItem.ToString());
                //上面为实例化Form3窗体,利用窗体参数传输数据。
                //原来的代码内容:childForm3.Show();
                //下面是更改后的代码内容
                childForm3.MdiParent = this.MdiParent;
                //使得打开的窗体和当前窗体共同指向同一个父窗体
                childForm3.Show();                
            }
}
小实验: 更改Form3窗体的返回按钮鼠标单击事件源代码:
private  void button1_Click_1(object sender, EventArgs e)
        {
            Form2 fm2 = new Form2();
            Fm2.MdiParent = this.MdiParent; //修改后的代码
            Fm2.Show();
            this.Close();
  }

4 如何防止重复打开窗口

我们继续改进本节第二个案例学习的内容,在解决了MDI父窗口控制子窗口问题后,连续点击菜单“窗口1”,会看见连续的打开了同一个窗口,界面如图1-25所示。
1-25   出现同一个窗口连续被打开的情况
问题讨论: MDI
小实验: 1
private  void menuItem3_Click(object sender, EventArgs e)
        {
            //直接检测是否已经打开此MDI窗体
            // 是否已经打开了?(用循环来判断)
            foreach (Form childrenForm in this.MdiChildren)
            {
                //检测是不是当前子窗体名称
                if (childrenForm.Name == "Formcc1")
                {
                    //是的话就是把它显示
                    childrenForm.Visible = true;
                    //并激活该窗体
                    childrenForm.Activate();
                    return;
                }
            }
            //下面是打开子窗体
Form2  Mdichild = new Form2();//首先实例化Form2对象,命名为Mdichild
            Mdichild.MdiParent = this;
           //其次指定即将打开的Form2对象的MdiParent,即Form2对象的MDI父窗口,为当前的主MDI窗口。
            Mdichild.Show();//显示Form2对象的MDI父窗口
}
注意,上面的代码由于每个打开的窗体都可能会用到,因此建议将之集成为方法后统一调用。




本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/201521,如需转载请自行联系原作者

目录
相关文章
|
8月前
|
C# C++
C#做界面果然比C++方便
C#做界面果然比C++方便
|
存储 前端开发 JavaScript
你可能需要的多文档页面交互方案(一)
你可能需要的多文档页面交互方案
105 1
|
安全 JavaScript 网络协议
你可能需要的多文档页面交互方案(二)
你可能需要的多文档页面交互方案
56 0
最最最常用的就是按钮了吧~ — 常用组件详解(按钮系列)
普通的基础组件自然不能满足我们的日常开发需求,所以小T带大家了解Flutter开发中的常用组件。
最最最常用的就是按钮了吧~ — 常用组件详解(按钮系列)
|
自然语言处理
用控件仅一条指令实现界面换肤和多语言版本(YFSkins)
这一段时间做程序,一直在做界面方面的工作,刚开始是简单的贴图操作,后来感觉不通用,代码重用性不好,并且要做很多基本工作
604 0
|
数据安全/隐私保护