C# 主窗口调用子窗口的值传递?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 主窗口调用子窗口的值传递?相关的知识,希望对你有一定的参考价值。

求教:
C# 学习到多窗口程序时,一个主窗口可以包含多个子窗口。
我想问下如何在调用的时候传递值。
比如 我想让子窗口加载一张图 我只知道可以用公共变量的方法,让子窗口加载从主窗口得到的文件路径,进行加载。
可是这样我觉得不符合模块化设计的思想,我觉得应当可以像函数那样传递值给子窗口,可是要怎么做呢?请教。

还有,代码里面比如
if(执行打开消息框)
新建一个FORM窗口(子窗口) 打开图片。

我想问的是,这里新建一个子窗口的代码只有一条,但是在程序运行时,我会打开很多个子窗口,那么他们的名字不会重复吗?
比如在主窗口 中x.lable.text= .....是对一个子窗口的lable进行操作。
但是主窗口代码里只有新建 x 子窗口这一个代码。
在程序运行后,打开多个子窗口后,那么x代表哪一个子窗口呢?

高分求教~ 谢谢
下午的时候比较急 所以说的不清楚:
下面我重新解释一下。

1: 比如主窗口中创建一个子窗口类实例,是否可以像函数那样传递值过去,以便于子窗口实例在加载时执行某些事件。我知道公共变量可以如此,但是这样如果把主子当做模块分开来写就不方便。

2:想请问 当一个类被创建多个实例后,比如子窗口被多次创建实例,
如 if(openfiledialog.show.......==dia......) form x=new form();
这时候X到底是哪一个实例呢?他们不会重复吗?还有我在新建下一个实例时,已经有了X这个实例,为什么却任然还能创建。

dongjin 说的我看看,二楼的 我不太懂 ,我都不知道面向过程和面向对象的区别,一般解释就是去买酒,一个是说怎么走,怎么交易..... 一个就是说去买酒,怎么买不用管 ,可是这样的解释对于我们刚学的学生愣是不知道在设计上有什么区别,C语言是面向过程吧,可是人家也可以把过程写在函数里面,再把函数封装到头文件里,每次使用先声明头文件,然后调用函数,这个和C#声明命名空间,然后再调用方法没有什么区别啊,初学 ,还请不吝赐教,谢谢~

1、你可以传值到子窗体,但是你子窗体构造函数里面要定义一下,比如:
public Form2(string str)

this.Text = str;

那么你在主窗体中创建子窗体就可以这样:
Form2 form2 = new Form2("我是窗体2");
form2.Show();
值就传过去了。

2、只要不是静态类,那么类就可以有无数个实例,他们都是独立的,既然是独立的自然不会重复,因为你没有办法在同一个方法里面使用同一个名称来创建2个实例,比如下面的代码:
private void button1_Click(object sender, EventArgs e)

Form2 form2 = new Form2("我是窗体2");
form2.Show();

Form2 form2 = new Form2("我是窗体2");
form2.Show();


你这样做不可能通过编译,会告诉你:已在此范围定义了名为“form2”的局部变量。你只要不在同一个方法内定义就行了,方法内定义的都属于局部变量,离开了方法体他们也就不存在了。
如果你想创建多个窗体而且能记住他们并且在整个类里面都能调用,那你得在类里面定义它,而不是方法中,比如:
Form2[] form2 = new Form2[5];
使用数组定义5个窗体,然后你可以分别把form2的实例赋给他们,这样你下次要调用某个你创建的form2实例的时候直接用form2[x]就可以访问到它了,定义在了类中,所以它在整个类中都存在,不是局部的变量。

最后在讲一下,传值到子窗体采用构造函数或者属性都是允许的,我看你需要先了解构造函数和属性的定义,把这些弄清楚了应该能明白了,以后如果子窗体给主窗体传值那么就需要用到事件,现在对你来说不是学习事件的最好时间,慢慢来吧,先弄清楚基本概念。
参考技术A 窗体间传值有几个办法,出了采用子窗体公开变量的办法外还有如下几个办法:
1.公开子窗体的控件~既将构造文件中控件声明是的修饰符改为public,效果和公开变量一样
2.采用Cookie,这个就简单了,吧值存到cookie中,可以在任一窗口取出来用,并进行修改
3.采用资源,或文本输出。这个就是将数据存到固定文件中,和cookie类似。
4.配置文件,同3.但有个特性就是可以用这个进行控件与数据绑定。
5.数据库,不管成不承认,这个用的最多~原理同2,3,4。只不过把数据存到数据库。一般用在使用数据库的时候
6.关于其他办法请参见下面的文章:
http://hi.baidu.com/yaobing0687/blog/item/b2c8433f617bc33771cf6c38.html
言归正传:
1.你的这种想法不是不能实现,只不过用C#会比较难,需要自己用代码构造窗体函数~不如c++来的容易一些,建议放弃
2.刚测试了下在不指定Name的情况下,x代表的是最后一次谭处端窗口,这种情况下,你有两种办法解决~
办法1.
int i=0;
在 form x=new form();
后面给x窗体一个动态的Name值:x.Name=“ChildFrom”+i.ToString();
i++;
这样就是每个窗体都有个Name值了。就可以通过Name来调用各个窗体了

办法2:
使用泛型:List<Form2> f2s=new List<Form2>();
form x=new form();
f2s.Add(x);
然后通过f2s来操作子窗体
参考技术B 子窗体你在打开(类的构造)的时候,是可以构造多个的,这就好比你构造了多个类是一样的!至于X代表哪个窗体,你可以在构造的时候标识一下,通过一些额外的手段,比如新增一个成员变量,表示窗体的ID,或者通过窗体的名称(不能一样噢) 参考技术C 其实所谓的窗体和类是一样的.
给他加个带参数的构造函数不久行了.
f1 是主窗体.f2是子窗体.
f1中
f2 f=new f2("图片路径")
f.show();
而f2的默认构造函数是没有参数的.请收到添加
参考技术D (1)传参数的时候,你可以重载子窗口的构造函数,给它加上参数,
比如public form(String str),调用的时候你就可以将父窗口的值传给它了。
(2)你说的应该是动态创建窗口,每个窗口都会有自己的ID,不会重复的。
(3)你动态创建的窗口,里面的控件没有添加事件,这样你就需要自己手动添加事件,例如
dongjin所写。

MFC 主窗口如何在创建的子窗口前

我做一个工程时遇到一个问题,用非模方式创建出来的窗口总是在主窗口前,请问如何将主窗口设置在前,或者点击主窗口时主窗口会显示在前???

参考技术A 你在打开子模块的时候,获取主窗口指针并调用主窗口的这一个函数SetWindowPos(&wnd,TopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE),之后你再把这个TopMost的状态取消掉就可以了 参考技术B 将主窗口作为子窗口的父窗口,即创建子窗口时,parent参数是主窗口 ,前后次序可以用set Zorder改变追问

我就是这样的,可是还是......

追答

这是因为你的某个操作里隐含改变了Zorder,你可以在合适的地方再改变过来。如在点击会有ONFOUCS,就会自动将窗口激活,你可以重写ONFOUCS

追问

晕死不小心按错了选择了满意的回答了 我再提问哈~!

参考技术C 选择主窗口置顶,或用模拟器追问

请问怎么选择主窗口置顶

追答

internet选项,高级,允许页面自动转换

本回答被提问者采纳

以上是关于C# 主窗口调用子窗口的值传递?的主要内容,如果未能解决你的问题,请参考以下文章

在mfc中 为啥关闭子窗口连带把主窗口关闭了??

js子窗口调用父窗口函数并传递对象给父窗口的方法

showModalDialog/showModelessDialog实例,父窗口向子窗口传递值,子窗口设置父窗口的值,子窗口关闭的时候返回值到父窗口.关闭刷新父窗口

Qt:子窗口中如何获取主窗体ui中的控件

网页前端WeX5架构下,WinDialog子窗口1传递参数给主窗口关闭,再弹出子窗口2失败

C# winform 父窗口子窗口按钮控制