博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1-4 多文档界面处理(2)
阅读量:5887 次
发布时间:2019-06-19

本文共 3753 字,大约阅读时间需要 12 分钟。

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,如需转载请自行联系原作者
你可能感兴趣的文章
c语言打开alist文件,C语言 文件的打开与关闭详解及示例代码
查看>>
DEFERRED_SEGMENT_CREATION
查看>>
Ada boost学习
查看>>
开源 java CMS - FreeCMS2.3字典管理
查看>>
block,inline和inline-block概念和区别
查看>>
移动端常见随屏幕滑动顶部固定导航栏背景色透明度变化简单jquery特效
查看>>
python基础---网络编程(socket编程)
查看>>
br-ex绑定的物理接口不能配置ip的原因
查看>>
centos6.x中fstab配置文件出错导致无法启动及忘记root密码解决方法
查看>>
Linux命令汇总
查看>>
C#静态类、静态构造函数,类与结构体的比较
查看>>
SVN+Gearman构建异步式代码分布系统
查看>>
在linux系统中I/O 调度算法
查看>>
mysql重要参数总结---不断更新中
查看>>
win10主机与域控制器失去信任,没有管理员权限
查看>>
Windows Server 2003 家族产品支持两种授权模式
查看>>
通用权限管理系统组件 中集成多系统的统一登录(数据库源码级)附源码
查看>>
redis启动流程介绍
查看>>
Ubuntu 下pdf文件,编辑软件 Master pdf editor
查看>>
git diff提示filemode发生改变
查看>>