精华内容
下载资源
问答
  • 大家可能经常会遇到在窗体间传递某些数据的功能要求,这里介绍给大家一种方法:在子窗体中自定义一个构造函数,参数类型是主窗体,当要显示子窗体的时候,就用这个构造函数来实例化子窗体,然后把this指针传进去,说...

    大家可能经常会遇到在窗体间传递某些数据的功能要求,这里介绍给大家一种方法:

    在子窗体中自定义一个构造函数,参数类型是主窗体,当要显示子窗体的时候,就用这个构造函数来实例化子窗体,然后把this指针传进去,说起来太抽象了,我大概一写大家应该就明白了:
       public class frmMain:Form
       {
            ...
            frmControl controlForm=new frmControl(this);
            controlForm.Show();
        }

        public class frmControl:Form  //子窗体,用来控制主窗体的某些显示!
        {
             private frmMain mainForm=null;
             public frmControl(frmMain mainForm)
             {
                  this.mainForm=mainForm;
              }
              private void button1_Click(object sender,EventArgs e)

                   {

                               frmMain.textBox1.Text=this.textBox1.Text;  //把子窗体的文本框值传递给主窗体的文本框!

                   }


         }

     

    转载于:https://www.cnblogs.com/xuefeng1982/archive/2009/07/17/1525541.html

    展开全文
  • 我们经常遇到在程序设计中,数据可以在同一个窗体中传递,也可能在窗体间传递。这里将要阐述窗体之间的数值传递。例如需要通过调用子窗体来修改父窗体的内容。 【注意】窗体间传值要弄清楚到底是哪个对象的问题,...

      我们经常遇到在程序设计中,数据可以在同一个窗体中传递,也可能在窗体间传递。这里将要阐述窗体之间的数值传递。例如需要通过调用子窗体来修改父窗体的内容。

    【注意】窗体间传值要弄清楚到底是哪个对象的问题,否则容易传错值。

    例如,我们要实现,在登陆窗体中,把当前的登陆用户信息传递给主窗体,但是却实例了一个新的对象loginFrm把里头的信息传递给了mainFrm,得到了的却是空值,为什么??

       窗体传值的前提是,要传的字段,在类里面的访问修饰符必须是public(如果在源窗体内传值则例外,参见下列常用方法2)

    《方法》这里先阐述一下常用的几种方法:

    【以下转载于博客】cnblogs.com/tomin/archive/2009/02/25/1397677.html
    【1】
    静态变量,在窗体里中,写入一个静态变量A,可以给其赋值,那么在这个项目中,就可以通过Form1.A来调用。不推荐此种方法,不太安全。

    【2】比较稳妥的方法,就是在传值的过程中,首先在被传值窗体form2中,建立一个公有属性B,做为接收者。

         在form1里实例form2时,把需要传递的值A赋给新实例form2.B,或者是通过Form2类的构造函数传递,方法很多,此种传值较为安全(推荐)。

    【3】若是要得到一组固定的数据,那么可以写成一个公有的带返回值的方法,在源窗体中。然后在目标窗体中实例源窗体对象,调用此方法获得数据,此方法虽不同于静态变量,但有异曲同工之妙,可以不必强调对象。其缺点是,方法体内传递数据为固定的,不能变通。

    【4】查询对话框,大家都用过记事本,里头有个查询功能,就是当选中一段文字时,打开查询对话框,就会在查询对话框中显示选中的那段文字,其代码实现为:
          在Form1中:我们要把一个文本传递给Form2窗体,假定为passText
                  public string passText
                  {
                       get{ return textBox1.Text;}
                  }      

                  Form1
    中还有个按钮button1在其点击事件中有:
                                 private void button1_Click(object sender,EventArgs e)
                  {
                          Form2 f2 = new Form2();   //
    呃。。这个就不用说了
                          f2.Owner = this;  //
    设置附属,好搭关系~
                         f2.Show();   //
    看得出来撒
                  }

    /********************************************************************************/
    Form2的对象中:
                
    假设有个文本框txtBox1,
                 private void form2_Load(object sender,EventArgs e)
                 {
                                        //
    通过目标窗体,找到拥有它的源窗体,得到的是一个object
                                        
    对象,要转换成Form1这个类型,就可以得到它的公有属性passText拉。
                     textBox1.Text = ((Form1)this.Owner).passText;
                                 }
    这样当我们打开Form2时,就会在其文本框中,显示Form1的文本框信息了

    想要做到查询对话框显示选中文本的效果,只需要在把passText的属性改成textBox.SelectedText即可.
    这种方法的主要好处是在于,我们能在目标窗体的对象中,找到源窗体的对象。而有别与上面两种情况。

    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    --------------------------------------------------------------------------------------------------------------------------------------------------------
    实例一《构造传值方式》】
    在Form1和Form2中,将Form1中的输入值传递给Form2并显示于Form2:
    例如Form1中添加一个TextBox和Button控件,Form2中添加一个Textbox显示Form1的文本和Button控件点击关闭:
     
     
    Form1中添加【添加信息】的代码如 下:
     private void button1_Click(object sender, EventArgs e)
            {
                if (textBox1.Text.Trim()!="")
                {
                     Form2 form = new Form2(textBox1.Text.Trim());
                     form.ShowDialog();
                }
                else
                {
                    MessageBox.Show("请填写完整信息!");
                }
              
            }
    Form2中添加代码:
    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
            /// <summary>
            /// 重构函数
            /// </summary>
            /// <param name="message">传递给Form2的TextBox文本编辑框中</param>
            public Form2(string message)
            {
                InitializeComponent();
                txtNumber.Text = message;
            }
            /// <summary>
            /// 公共字段
            /// </summary>
            private void btnOK_Click(object sender, EventArgs e)
            {
                this.Close();//关闭这个窗体
            }
    }
     
    实例2《公有字段传值方式》】

    和【实例1】一样,但是本例采用的是公有字段进行传值:

    在Form1中添加如下代码:

    (1)将private System.Windows.Forms.TextBox textBox2; 改为public。

    (2)

            /// <summary>
            /// 公有变量传递
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button3_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2(this);
                f2.ShowDialog();
            }
            /// <summary>
            /// 公共字段
            /// </summary>
            public string Msg
            {
                get
                {
                    return textBox2.Text.Trim();
                }
            }

    *************************************************************

    Form2 代码添加       

          public string Msg
            {
                get
                {
                    return txtNumber.Text.Trim();
                }
                set
                {
                    txtNumber.Text= value;
                }
            }
            public Form2(Form1 f1)
            {
                InitializeComponent();
                txtNumber.Text = f1.Msg;
            }

    【实例3】委托与事件传递 

    功能描述:与前面实例1和实例2不同的是,本实例实现在子窗体中改变父窗体的内容,通过委托和事件来传值给父窗体

     

    如上图所示,调用Form3中的按钮【启动调用Form4】,弹出Form4的窗体,修改Form4的窗体内容,点击【确认】则实现了修改父窗体Form3的内容。

    实现过程如下所示:

    在【Form3】中代码

    (1)定义一个结果对象,用来存放子窗体返回的结果,同时定义一个事件,可以让子窗体修改父窗体的状态。代码如下

        //声明delegate对象
        public delegate void TextChangedHandler(string s);

        public class CallObject
        {
            //用来存放子窗体返回的结果
            public string ResultValue = "";

            //定义事件对象,可以让子窗体修改父窗体的状态
            public event TextChangedHandler SelTextChanged;

            //以调用delegate的方式写事件触发函数
            public void ChangeSelText(string s)
            {
                if (SelTextChanged != null)
                {
                    //调用delegate
                    SelTextChanged(s);
                }
            }
        }

    (2)双击按钮【启动调用Form4】,激活事件

          private void btnCallF4_Click(object sender, EventArgs e)
            {
                CallObject co = new CallObject();

                //用+=操作符将事件添加到队列中
                co.SelTextChanged += new TextChangedHandler(EventResultChanged);
                Form4 f4 = new Form4(co);
                f4.ShowDialog();
                txtF4EventResult.Text = "Form4的返回值是:\r\n" + co.ResultValue;
            }
            //事件方法
            private void EventResultChanged(string s)
            {
                txtF4Select.Text = s;
            }
        }

    在【Form4】中的代码:

    (3)在子窗体添加一个构造函数,以便接收结果对象

    private CallObject co;
            public Form4(CallObject cov)
                : this()
            {
                this.co = cov;
            }

    (4)在子窗体改变选择,

      private void radbtn_A_CheckedChanged(object sender, EventArgs e)
            {
                co.ChangeSelText("A");
            }

            private void radbtn_B_CheckedChanged(object sender, EventArgs e)
            {
                co.ChangeSelText("B");
            }

            private void radbtn_C_CheckedChanged(object sender, EventArgs e)
            {
                co.ChangeSelText("C");
            }
            private void btnSend_Click(object sender, EventArgs e)
            {
                co.ResultValue = textBox1.Text;
                Close();
            }

     

    -------------------------------------------------------------------------------------------------


    【5】窗体间同步传值的实现,就是实时更新两个窗体间的信息,有心的朋友可能发现,既然能在目标窗体中,找到源窗体,那么我们还可以通过源窗体来控制目标窗体,从这里面突破,就能达到此效果了。代码如下还是依照4例:在Form1中:
    程序代码:

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            public string passText
            {
                get {
                    return textBox1.SelectedText.Text;
                }
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.Owner = this;
                f2.Show();
            }

            private void Form1_Load(object sender, EventArgs e)
            {

            }

            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                if(this.OwnedForms.Length != 0)
                (this.OwnedForms[0] as Form2).selectText = textBox1.Text;

    /*OwnedForms是一个数组,表示当前对象拥有的子窗体数组,同样要把通过下标得到的元素转换为Form2类型。*/
            }
        }
    }

    namespace WindowsApplication1
    {
        public partial class Form2 : Form
        {
            public string selectText
            {
                set
                {
                    textBox1.Text = value;   //
    设置一个属性,让form1操作
                }
            }

            public Form2()
            {
                InitializeComponent();
            }

            private void Form2_Load(object sender, EventArgs e)
            {
                textBox1.Text = ((Form1)this.Owner).passText;
            }
        }
    }

    最后,要说一下的是,在传值的时候,不光可以传变量属性,还有个很好的东西,每个窗体都有个Tag属性,是一个标记,object类型的,我们可以把一个类赋给它。这样就为我们的代码,提供了极大的便利,大家可以依据上面4种传值方式,进行使用。
     
    部分参考《项目中的.NET》
    展开全文
  • c#中如何在两个窗体间传递数据? 2011-06-04 12:54天若星尘 | 分类:C#/.NET | 浏览2397次 窗体A、B,A中有listbox1,B中有listbox2和按钮1。 首先打开窗体A,通过A上的另外一个按钮打开窗体B,窗体A不关闭...

    c#中如何在两个窗体间传递数据?

    2011-06-04 12:54天若星尘 | 分类:C#/.NET | 浏览2397次
    窗体A、B,A中有listbox1,B中有listbox2和按钮1。
    首先打开窗体A,通过A上的另外一个按钮打开窗体B,窗体A不关闭;
    现在在窗体B的listbox2中输入字符串S,点击按钮1,需要窗体A的listbox1中显示出S,如何实现?
    不能重新生成窗体A。
    需要核心代码!
    2011-06-04 14:10 提问者采纳
    做了一个测试  按照vwenye 回复的
    Form1 中 打开Form2中此处用 TextBox 
    Form1中打开 Form2按扭代码为:
         private void button3_Click(object sender, EventArgs e)
            {
                Form2 f = new Form2();
             
                f.MessageSent += delegate(object caller, string msg)
                    {
                        this.textBox1.Text = msg;
                    };
                f.ShowDialog();
            }
    Form2中代码为:
         public delegate void SendMessage(object sender, string message);
            public event SendMessage MessageSent;
    
            public Form2()
            {
                InitializeComponent();
            }
    
    private void button1_Click(object sender, EventArgs e)
            {
                if (this.MessageSent != null)
                    MessageSent(this, textBox1.Text);
            }
    
    这样在Form2中修改TExtBox 值点击按钮则Form1中会自动变化
    展开全文
  • 我想通过点击窗体A的按钮把一个SQL语句传给窗体B , 查询结果在窗体B中显示,然后在选择自己需要的数据回传给窗体A ,不知道如何实现了,麻烦高手指点下.
  • C#中窗体间传递数据的几种方法

    千次阅读 2007-04-22 09:58:00
    经常会遇到C#中窗体间传递数据,搜了一下...有时在程序设计中,数据不仅要在同一个窗体中传递,还要在窗体间传递,尤其是用子窗体如何改变父窗体。这个问题已经不少人问过,在群里也为了那种方式好而争论过,昨天雨声

    经常会遇到C#中窗体间传递数据,搜了一下网上的资料,做一下汇总

    http://blog.donews.com/coolbo/archive/2005/05/29/403132.aspx

    一个稍微复杂一点的程序一般都有两个或者更多的窗体。有时在程序设计中,数据不仅要在同一个窗体中传递,还要在窗体间传递,尤其是用子窗体如何改变父窗体。这个问题已经不少人问过,在群里也为了那种方式好而争论过,昨天雨声.net问窗体间互操作的问题,让我萌生就这个问题写下这篇文章,希望对刚刚接触C#的朋友有所帮助,有疏漏之处,也希望朋友们指正,欢迎讨论。

    窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,无外乎以下几种方式:

    1. 公共静态变量;
    2. 使用共有属性;
    3. 使用委托与事件;
    4. 通过构造函数把主窗体传递到从窗体中;
    5. 使用中间类。


    前4种方法适用的人比较多,大家也比较熟悉,我这里就不多说了,主要想详细介绍一下第五种,使用中间类的方法。比如从frm1打开frm2,在frm2中把frm1的text值改变为用户输入的字符串,并且关闭frm2。

    首先先定义一个中间对象Observe
    using System;

    namespace demo
    {
     /// <summary>
     /// Observe 的摘要说明。
     /// </summary>
     public class Observe
     {
      private string strText;
      public event EventHandler TextChange;
      public string StrText
      {
       get{return strText;}
       set
       {
        strText = value;
        if(TextChange != null)
         TextChange(this,EventArgs.Empty);
       }
      }
      public Observe()
      {
       //
       // TODO: 在此处添加构造函数逻辑
       //
      }
     }
    }

    在Form2中定义一个Observe成员
      private Observe o_Observer;
      public Observe observe
      {
       set
       {
        this.o_Observer = value;
       }
      }
    在Form2的事件处理中改变o_Observe的StrText
      private void button1_Click(object sender, System.EventArgs e)
      {
       o_Observer.StrText = this.textBox1.Text;
       this.Close();
      }

    在Form1中实例化一个Observer成员
    private Observe o_Observe = new Observe();
    在Form1的事件处理函数中创建Form2的实例,令Form2的observe属性等于Form1的o_Observe并且订阅Observe的事件
      private void button1_Click(object sender, System.EventArgs e)
      {
       Form2 frm = new Form2();
       frm.observe = o_Observe;
       this.o_Observe.TextChange += new EventHandler(o_Observe_TextChange);
       frm.Show();
      }

    这样,Form1知道Form2,Form2不知道Form1运行结果如下:


     

     

    http://www.cnblogs.com/crhacker/archive/2005/04/10/134933.html

    方法1:首先,我们在Form2中定义:

    private Form1 mF_Form

    我们更改Form2的构造函数为有参数的

    public Form2 ( Form1 myForm )
    {
    //
    // Windows 窗体设计器支持所必需的
    //
    InitializeComponent ( ) ;
    this.mF_Form  = myForm ;   /这样在Form1中申明Form2的时候就把Form1的实例传递过来了
    //
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
    //
    }

    在Form1中,我在 要用到Form2的地方申明如下:

    Form2 f2=new  Form2(this);这里的this指的就是Form1当前的实例,也就是把当前Form1的实例通过Form2的构造函数传递给Form2类(其实在网上看到过比较蠢的方式,就是在构造函数里面传递要传递的信息如:字符串或是数字等,这样做很有局限性,不能传递其他的,所有我们可以直接传递实例,来完成传递更多的信息。)

    这样在Form2中使用myForm 就可以对原来的Form1窗口进行操作了。但是你要把要操作的Form1中的域和函数定义成public形式的(这样可能不安全),此时的myForm就是真正的最开始打开的Form1了,你可以用这个实例来进行两个窗体的通讯了。

    方法2:其实C#中提供了窗体间进行通讯的现成的属性,呵呵,我们能想到的,微软也想到了,他们创造的语言其实确实可以说是人性化了。

    在Form1类中申明Form2时用如下代码:

    Form2 f2=new Form2();//类Form2中的构造函数不改,还是无参的

    f2.owner=this;这里的this指的是类Form1当前的实例。

    //也可以使用函数的方法,给当前实例添加一个附属窗口  代码:this.AddOwnedForm(f2);

    在Form2类的定义中写如下代码:

    Form1 f1=this.owner;

    这样f1对应的就是原来的Form1的实例了,也就可以用这个进行通讯了。但是还是要把不同类之间访问的域和函数定义成public,哎,安全确实是一个问题!!

     

     

    http://blog.csdn.net/eagleeye/archive/2006/06/28/845238.aspx 

    这个主要是演示数据库操作的数据传递

    展开全文
  • 上面描述的例子,就涉及到了一个父子窗体间数据传递如何实现这一数据传递,当然有很多方法。这里只是记录一下这个例子中我使用的方法。我的方法是子窗体点击“确定”按钮时,将操作结果构造成json格式的...
  • 窗体间的跳转 1. 第一种打开窗体,原本窗体保留窗口 创建两个窗体 登录成功后我们调转到QQ主界面,登录时编写调转代码 new出来我们要跳转的窗体, 通过Show()显示窗体 登录成功后显示第二个窗体。 2. 第二...
  • 发现很多Qt的初学者,经常会窗体间如何传递数据”的问题上卡住,而网上通常只是简单描述为使用信号与槽(signal& slot)机制来传递 虽然信号与槽的传递方式确实没错,但是却不一定能适用到全部的情况。
  • 两个窗体间实时传递数据

    千次阅读 2008-11-24 10:44:00
    相信大家做系统的时候,很多人都遇到需要两个不同的窗体间传递数据的情况,例如可以单独打开一个窗口,用于显示代码名称对照关系,通过双击该窗体的数据,我们希望这个数据传递到另一个窗体中。如何实现两个窗体...
  • 窗体间数据传递的几种方法: 1.通过子窗体的Tag属性 ...我的另外一篇博文中(WinForm中窗体间数据传递(二))可以借助向外引发事件来解决这个问题 例子截图如下: 当用户点击子窗口的“添加...
  • 我们在实际开发中,经常要用到在窗体间传递数据。很多情况下,我们用委托把数据从子窗体传递到主窗体,这个例子我们来看下如何利用接口把数据从主窗体广播到所有子窗体。 首先我们定义一个接口:
  • 思路:子窗口“添加用户”的中通过点击"添加用户",会动态的向外引发一个事件,通过该事件,我们可以进行数据传递 其他窗口中,可以来响应该事件 其中,子窗口只负责向外引发一个事件,将事件的实现方法委托给...
  • 委托之窗体传递数据

    2010-03-02 14:41:00
    窗口的数据传递,有多种方式,这篇随笔中主要是阐述一下利用委托如何传递数据本实例程序中,有两个窗体:一个主窗体FrmMain,接收数据;一个子窗体FrmChild,传出数据,UI如下: 窗体中,[设置]...
  • 提出Windows窗体间消息传递的问题:如何根据子窗体的状态更改父窗体的状态?如双击DataGridView的行记录后弹出修改该行记录的子窗体,修改完数据后希望DataGridView数据刷新,这就需要子窗体通知父窗体刷新数据!...
  • WinForm窗体间如何传值

    2014-11-28 17:48:00
    窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量; 使用共有属性; 使用委托与事件; 通过构造函数把主窗体传递到从窗体中; 一、通过静态变量 特点:传值是双向的,...
  • 窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式:   公共静态变量; 使用共有属性; 使用委托与事件; 通过构造函数把主窗体传递到从窗体中;   一、通过静态变量 特点:...
  • 《设计数据层组件并间传递数据》笔记学习向 Microsoft .NET 应用程序公开数据的最佳方式,以及如何实现一个有效的策略以便分布式应用程序的层间传递数据主要是想为了公司的最近的项目找到一个比较好的持久/...
  • 窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量; 使用共有属性; 使用委托与事件; 通过构造函数把主窗体传递到从窗体中; 一、通过静态变量 特点:...
  • 窗口的数据传递,有多种方式,这篇随笔中主要是阐述一下利用委托如何传递数据本实例程序中,有两个窗体:一个主窗体FrmMain,接收数据;一个子窗体FrmChild,传出数据,UI如下: 窗体中,[设置]...
  • 初学c#时,误以为属性和变量没...下面我就一例子来说明窗体间如何进行通信的(传递数据)。 图1(FrmSearch)图1是我做通讯录时设计的一个界面,不难看出这个界面是用来实现查询功能的一部分.当选中Listbox中的某一项

空空如也

空空如也

1 2 3 4 5
收藏数 87
精华内容 34
关键字:

如何在窗体间传递数据