zoukankan      html  css  js  c++  java
  • 使用委托实现窗体之间的传值--事件订阅实现传值

    下面我实现一个最简单的页面传值功能,相信初学者能一看就明白。

    点击打开按扭,打开传输值窗体

    复制代码
     1 public partial class Form1 : Form
     2     {
     3         public Form1()
     4         {
     5             InitializeComponent();
     6         }
     7 
     8         public void getValue(string strV)
     9         {
    10             this.textBox1.Text = strV;
    11         }
    12 
    13         private void button1_Click(object sender, EventArgs e)
    14         {
    15             Form2 frm = new Form2();
    16             //frm.fatherform = this;//将当前窗体赋给fatherform
    17             //frm.getTextHandler += new Form2.GetTextHandler(getValue);//给事件赋值(注意:GetText方法的参数必须与GetTextHandler委托的参数一样,方可委托)
    18             frm.getTextHandler = getValue;//将方法赋给委托对象
    19             frm.ShowDialog();
    20         }
    21     }
    复制代码

    输入值后点击传输按扭,'value'将显示在接收值窗体的TextBox上

    复制代码
     1 public partial class Form2 : Form
     2     {
     3         public Form2()
     4         {
     5             InitializeComponent();
     6         }
     7         //public Form1 fatherform;
     8 
     9         public delegate void GetTextHandler(string text);//声明委托
    10        // public event GetTextHandler getTextHandler = null;//定义委托事件
    11        public  GetTextHandler getTextHandler;//委托对象
    12         private void button1_Click(object sender, EventArgs e)
    13         {
    14             //if (fatherform != null)
    15             //{
    16             //    fatherform.getValue(this.textBox1.Text.Trim());
    17             //    this.Close();
    18             //}
    19             if (getTextHandler != null)
    20             {
    21                 getTextHandler(this.textBox1.Text.Trim());
    22                 this.Close();
    23             }
    24         }
    25     }
    复制代码

    这里主要为大家呈现了两种传值方式:

    一、将Form1窗体传给fatherform对象,随后我们就可以在Form2中操作Form1了。
    二、使用委托,将getValue方法赋给事件或委托对象getTextHandler,那么实现getValue操作就不用自己去做了因为已经委托给getTextHandler,直接调用getTextHandler即可

    参考出处:http://www.cnblogs.com/pfcan66/archive/2012/09/12/2680596.html

    ===================================================================

    再来看几个传值的方法,有如下几种方式,其中主要讲讲事件订阅传值的形式。

    1. 声明个全局变量,就是App.xaml里面声明;在所有窗体里面都可以引用 Application.Current.Properties["ArgumentName"];

    2. 第二个就是 在目标窗体上面公开个 属性,直接赋值;

    3. 最后就是在Uri里面传参数 NavigationService.Navigate(window object,argument value)

    4. 采用事件响应,传递值。 

    举例:点击主窗口MainWindow 上的一个OpenSubWindow按钮 -> 打开子窗口SubWindow -> 在子窗口中的TextBox中输入值, 点击OK后关闭 -> 主窗口上的TextBox获取子窗口中的值。

    1. 在子窗口中定义一个事件PassValuesEvent。 当点击 OK 按钮时,触发事件,并传递数值。( PassValuesEventArgs 是EventArgs类,需要同时定义好) 

    复制代码
        public partial class SubWindow : Window
        {
            public delegate void PassValuesHandler(object sender, PassValuesEventArgs e);
    
            public event PassValuesHandler PassValuesEvent; 
    
            public SubWindow()
            {
                InitializeComponent();
            }
    
            private void btnOK_Click(object sender, RoutedEventArgs e)
            {
                string value1 = tbValue1.Text;   // Text Property return value is string type .
                int value2;
                Int32.TryParse(tbValue2.Text, out value2);
    
                PassValuesEventArgs args = new PassValuesEventArgs(value1, value2);
                PassValuesEvent(this, args);
    
                this.Close();
            }
        }
    复制代码

    2.  在主窗口中的OpenSubWindow按钮点击的方法中,订阅了PassValuesEvent事件。当事件触发时,获取传递的参数的值。

    复制代码
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void btnOpenSubWindow_Click(object sender, RoutedEventArgs e)
            {
                SubWindow subWindow = new SubWindow(); 
    
                // 订阅事件
                subWindow.PassValuesEvent += new SubWindow.PassValuesHandler(ReceiveValues);
    
                subWindow.Show(); 
            }
    
            private void ReceiveValues(object sender, PassValuesEventArgs e)
            {
                this.tbValue1.Text = e.Value1;
                this.tbValue2.Text = e.Value2.ToString(); 
            }
        }
    复制代码

     主要说明:子窗口的PassValuesEvent事件,是从PassValuesHandler代理的一个实例对象并且被定义成event类型,所以在其他类里就可以订阅这个事件了。

    参考出处:http://www.cnblogs.com/fdyang/archive/2013/03/25/2980451.html

  • 相关阅读:
    Javascript设计模式理论与实战:单例模式
    详解CSS盒模型
    linux添加计划任务
    python删除目录下七天前创建的文件
    centos上源码安装clang 3.8
    使用postman发送数据并构建collections执行测试
    python多线程实现同时执行两个while循环
    使用Python写Windows Service服务程序
    用Pyinstaller打包发布exe应用
    使用Jmeter监测服务器cpu、内存等性能
  • 原文地址:https://www.cnblogs.com/mq0036/p/6232850.html
Copyright © 2011-2022 走看看