注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

(转)C#4.0委托和事件方法  

2011-05-31 18:05:37|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C#4.0中使用了新的委托和事件的方式,记录下来,还是那句话,技术在进步,我们也要进步。 

在WinForms程序里实现窗体传值的最佳实践 收藏 此文于2011-05-31被推荐到CSDN首页
如何被推荐?
这个问题被问到相当多,很多网友都知道用属性,用委托。但是具体怎么做却不清楚。

我在网上看到很多文章,虽然提出的方案可行,但是实现的都不好,于是自己动手写了一个例子给大家。希望这个例子足够简单完整。

我将标题设定为“最佳实践”,意味着我觉得窗体传值应该有一个统一的,标准的模式给大家套用。我认为我提供的模式比较优雅,但是更优雅的设计是采用 MVC。因为那样会大大增加例子的复杂度,不适合新手,没有给出。

为了实现这个例子,你需要准备2个窗口,一个叫MainForm,上面至少需要一个richTextBox,两个工具栏按钮。
另一个叫 MyDialog 的子窗口,上面有一个 textBox1,一个 Button,作为确定按钮。

两个工具栏按钮分别实现两种形式的窗体调用,模态的和非模态的。

模态的意思是,我们打开对话框,将值传进取,操作完成确定,主窗体再获得对话框的值。
非模态的意思是,我们打开对话框,可以在不关闭窗口的情况下和主窗体交互,主窗体可以即时获得子窗体的值。类似记事本的查找替换对话框。

下面是代码:

主窗体:

C# code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private MyDialog m_dlg;

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            MyDialog dlg = new MyDialog(richTextBox1.Text);
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.Text = dlg.TextBoxValue;
            }
        }

        private void toolStripButton2_Click(object sender, EventArgs e)
        {
            if (m_dlg == null)
            {
                m_dlg = new MyDialog(richTextBox1.Text);
                m_dlg.TextBoxChanged += new EventHandler(
                    (sender1, e1) =>
                    { richTextBox1.Text = m_dlg.TextBoxValue; }
                );
                m_dlg.FormClosed += new FormClosedEventHandler(
                    (sender2, e2) => { m_dlg = null; }
                );
                m_dlg.Show(this);
            }
            else
            {
                m_dlg.Activate();
            }
        }
    }
}


子窗体

C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class MyDialog : Form
    {
        public event EventHandler TextBoxChanged;

        public string TextBoxValue
        {
            get { return textBox1.Text; }
            set { textBox1.Text = value; }
        }

        public MyDialog() : this("") { }

        public MyDialog(string Param)
        {
            InitializeComponent();
            TextBoxValue = Param;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (TextBoxChanged != null)
                TextBoxChanged(this, e);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Close();
        }
    }
}

 

简单分析下这个代码:

模态传值的方法是:传入时可以使用构造函数,传出的时候首先判断是否用户是通过确定关闭的,如果是,那么用属性传出。
这个做法也是框架库的做法,比如打开文件对话框。

非模态的情况略微复杂:因为我们需要主窗体能和子窗体实时交互,为了同步主窗体和子窗体的数据,我们用了事件。有人问了,为什么我们不能让子窗体直接操作主窗体,这是因为考虑到对话框可以被重用,如果让它直接操作主窗口那么就限制死了这个子窗口只能被某个特定的主窗口调用。为了解除子窗体对调用者的耦合,我们使用事件。如果子窗体已经被显示,主窗体再次调用子窗体,那么通常我们希望激活子窗体而不是再显示一个。具体的实现参考代码。

完整的代码在此:http://download.csdn.net/source/3169257编译运行这个代码需要 .NET Framework 4.0

有任何问题可以提问。代码有问题,或者更好的办法,也欢迎批评。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yunhaiC/archive/2011/05/31/6456767.aspx

在2.0时代,有匿名的委托和有名的委托,而在3.0之后Lamda表达式取代了匿名委托(作为编写内联代码的首选方式)的方式,大家要注意。

  评论这张
 
阅读(910)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017