vs2005 C# 主窗体和子窗体之间控件相互调用

转载 2011年09月26日 15:28:55
 
最近工作用到了C#开发Form应用程序,其中用到了主窗体和子窗体之间控件的相互调用。查了一些资料,现在根据自己写的一个小示例总结如下。
1.主窗体中调用子窗体控件
在主窗体中调用子窗体的控件很简单,只要在主窗体中创建子窗体的时候保留所创建的子窗体对象即可。
2.子窗体中调用主窗体控件
方法如下:
(1)   在主窗体类中定义一个静态数据成员,来保存当前主窗体对象,如下:
   public static MainForm pMainWin = null;
(2)   然后在主窗体构造函数中,给上述静态成员初始化,如下:
       public MainForm()
         {
            InitializeComponent();
            pMainWin = this;//这里是初始化
    }
(3)   在子窗体中调用主窗体,可以通过如下方式:主窗体类名.pMainWin”,例如:
   this.Text_S3.Text = MainForm.pMainWin.Text_M1.Text;
this.Text_S4.Text = MainForm.pMainWin.Text_M4.Text;
3.以上所做的,只是让你能够访问当前主窗体对象或子窗体对象,如果想操作控件,可以直接修改控件的成员访问符,即可以把”private”修改成”public”。当然最好的还是可以用增加公有属性的做法,这样不会破坏类本身的封装。如下:
public string Text_Box
        {
            get {return Text_S2.Text;}
            set { Text_S2.Text = value; }
        }
4.现在把一个小示例的代码粘贴如下:
(1)建立主窗体,添加四个文本框控件:Text_M1,Text_M4,用来主窗体中输入数据传给子窗体;Text_M2,Text_M3,用来显示子窗体中传过来的数据。一个按钮Btn_M1用来调用子窗体。Btn_M1按钮事件中添加代码,现把主窗体代码显示如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace MainSubControl
{
    public partial class MainForm : Form
    {
        //在主窗口类中定义一个静态成员,来保存当前主窗体对象,以便子窗体中调用其控件
        //子窗体调用时,通过"主窗体类名.pMinWin",然后在其构造函数中,给静态成员初始化.
        public static MainForm pMainWin = null;
 
 
        public MainForm()
        {
            InitializeComponent();
            pMainWin = this;
        }
 
        private void Btn_M1_Click(object sender, EventArgs e)
        {
            SubForm SubFormE = new SubForm();
 
            //由于下面要调用到子窗体SubFormE的Text_S1控件,所以需要把Text_S1控件的成员访问符号由private改成public即可.
            //调用子窗体SubFormE的Text_S2控件是通过增加了一个public属性来调用的,不是修改访问修饰符号,当然也可以这么做
            //也可以通过增加public方法来实现.
            if (SubFormE.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.Text_M2.Text = SubFormE.Text_S1.Text;
                this.Text_M3.Text = SubFormE.Text_Box;
                return;
            }
            return;
        }
 
        private void Btn_MExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
 
        private void MainForm_Load(object sender, EventArgs e)
        {
 
        }
    }
}
(2)建立子窗体,添加四个文本框:Text_S1,Text_S2,用来子窗体输入数据传给主窗体来显示;Text_S3,Text_S4,用来显示主窗体传过来的数据。一个确定按钮Btn_SOK。先把子窗体类代码显示如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace MainSubControl
{
    public partial class SubForm : Form
    {
        //在子窗体中定义一个主窗体类的一个私有成员,来保存当前主窗体对象.
        //为其构造函数增加一个主窗口的参数来初始化,子窗体中调用,用"this.pParentWin"
        //18private MainForm pParentWin = null;
 
 
        public SubForm()
        {
            InitializeComponent();
            //18pParentWin = WinMain;
        }
 
        public string Text_Box
        {
            get {return Text_S2.Text;}
            set { Text_S2.Text = value; }
        }
 
 
        private void SubForm_Load(object sender, EventArgs e)
        {
            this.Text_S3.Text = MainForm.pMainWin.Text_M1.Text;
            //18this.Text_S4.Text = this.pParentWin.Text_M4.Text;
            this.Text_S4.Text = MainForm.pMainWin.Text_M4.Text;
        }
 
      
        private void Btn_SOK_Click(object sender, EventArgs e)
        {
          
        }
      
    }
}
呵呵,结束了,希望对大家有帮助。

C#从一个类中调用控制主窗体的控件

方法一: 新建类,和构造函数 ,Form form1为传进来的参数 class ConnectionDeal { public ConnectionDeal(Form...
  • ya24241
  • ya24241
  • 2014年12月12日 18:09
  • 1600

在C#中子线程如何操作主线程中窗体上控件

在C#中,直接在子线程中对窗体上的控件操作是会出现异常,这是由于子线程和运行窗体的线程是不同的空间,因此想要在子线程来操作窗体上的控件,是不可能简单的通过控件对象名来操作,但不是说不能进行操作,微软提...
  • shuaihj
  • shuaihj
  • 2014年11月20日 17:57
  • 25939

C#使用委托调用主线程上的控件

摘自其他人博客,自己试过确实解决问题。(如在自己定义的线程里面给textbox赋值) 由于Windows窗体控件本质上不是线程安全的。因此如果有两个或多个线程适度操作某一控件的状态(set valu...
  • wyvbboy
  • wyvbboy
  • 2016年01月26日 15:23
  • 3902

c# 【委托】子窗体调用父窗体控件实例

原文地址:http://blog.csdn.net/chazikai24/article/details/5855254 下述代码,实现效果为:运行程序,点击form1的button1,弹出form...
  • lab2013
  • lab2013
  • 2013年03月08日 09:32
  • 1022

C#之WinForm基础 主窗体在哪里可以看到,如何更改主窗体,主窗体有什么特殊的地方

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 1、主窗体在哪里可以看到?在代码中! using System; usin...
  • yushaopu
  • yushaopu
  • 2016年09月17日 08:32
  • 1147

C# Winform项目中多线程环境下, 如何跨线程对Window窗体控件进行安全访问?

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 个人网站: http://www.x86asm.com QQ交流: 643439947 编程生涯: 2001年~至今[共15年...
  • Code_GodFather
  • Code_GodFather
  • 2016年02月29日 15:35
  • 4698

C# Winform 左侧菜单右边显示、子窗体显示在主窗体(子窗体当控件添加到Panel)

http://blog.csdn.net/xsfqh/article/details/43058753 Winform 也可以像网站一样左侧显示菜单右边显示点击菜单的子窗体(网页),不过子窗...
  • leeo1010
  • leeo1010
  • 2017年03月02日 15:19
  • 863

c#子线程调用主线程控件

相信对多线程有所了解的人都知道,子线程是不能直接操作winform上的控件的,因为默认的控件是在主线程上生成的,子线程是不能直接访问或者修改的,直接访问或者修改控件属性的话会报错。这个即使在Java上...
  • c13_tianming
  • c13_tianming
  • 2015年10月19日 10:23
  • 1934

C# 子线程调用主线程窗体的解决方法

C# 子线程调用主线程窗体的解决方法 摘自其他人博客,自己试过确实解决问题。(如在自己定义的线程里面给textbox赋值...
  • CatchMe_439
  • CatchMe_439
  • 2017年03月09日 09:50
  • 1378

C#线程传值到主窗体,主窗体控件接收到数据但是显示不出来,请问是什么问题? (回答)

就是使用delegate和invoke来从其他线程中控制控件信息。 网上有很多人写了这种控制方式,然而我看了很多这种帖子,表明上看来是没有什么问题的,但是实际上并没有解决这个问题,首先来看网络上的那...
  • caohh__
  • caohh__
  • 2017年12月08日 15:44
  • 93
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vs2005 C# 主窗体和子窗体之间控件相互调用
举报原因:
原因补充:

(最多只允许输入30个字)