网站首页  |   业界社区  |  电信社区  |  技术社区   |  极客社区  |  游戏社区  |  生活社区   |   科技博客  |   同事录
TechWeb-技术社区


标题: [c#] 父窗体传值给子窗体的问题
寒号鸟
TW金牌会员
Rank: 6Rank: 6



UID 82402
精华 1
积分 2965
帖子 1503
阅读权限 70
注册 2006-9-12
状态 离线
发表于 2008-8-28 10:09 资料 短消息 加为好友
父窗体传值给子窗体的问题

说明:主窗体Form1上一个Button1,子窗体childForm上有一个ComboBox. TechWeb-技术社区,f1`,}0V-D4E
我想Click Button1的时候根据注册表获得本机上的串口个数(串口个数是不一定的),然后传递给子窗体的ComboBox.Items 8i'x0d-P*N/d
TechWeb-技术社区8r8o8v"Z1V;` {
写了如下代码:
!K%c9K*B(^,}2G)QTechWeb-技术社区主窗体:
3N6~0v S:I.t&O w        private string str; tech.techweb.com.cn!z.S.B*Y&l'^3o7~0^'R#l
        public string Str 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛/`,o7y+j"o4Q
        { TechWeb-技术社区4O$g'L7T.a4N9H4I9W
            get { return str; }
"}-H/b;~#ETechWeb-技术社区            set { this.str = value; } tech.techweb.com.cn/^9G:l'{(B/_
        } 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛 G y(M#K9^'G s

$Z%T7o)a,F9],c        private void button1_Click(object sender, EventArgs e) *f8h0c2K3d$z
        {
Z&m0u9l"R*Y1I&Z;`TechWeb-技术社区            RegistryKey hklm = Registry.LocalMachine; 7d%i7e#V:L4T0})b
            RegistryKey comKey = hklm.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");
N-V!P$e)u/}6[2c!})P1~程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛            string[] comArray = comKey.GetValueNames(); !W7i9q'L(v7C8G"p a
            for (int i = 0; i < comArray.Length; i++)
'P6?2u&u&I'[tech.techweb.com.cn            {
p-G!W.m)D&X2a(j'`:@3{+`TechWeb-技术社区                this.str = comKey.GetValue(comArray).ToString(); //这里不知道该怎么写.我这种写发只能传最后一个字符串给子窗体. tech.techweb.com.cn+S2Q7X3e%|)]*p*|/R8_
            }
.|#P5o2f;n(U>echWeb-技术社区            childForm cf = new childForm();
.H'p*v1i%S)S&jtech.techweb.com.cn            cf.ShowDialog(this); TechWeb-技术社区'w,W,?,y!S'V*v&C(z-g
        } TechWeb-技术社区0b:W9q*? o&Z$@
子窗体:
)v-o2J6U)A(^TechWeb-技术社区
,}8`9K*r;i;m.}:i        //子窗体的Form_Load事件
3m"h(E)b%['M程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛        private void childForm_Load(object sender, EventArgs e)
7a)y;z#m-I {3N,v        {
1t'K.c-l8N$q            Form1 fm = (Form1)this.Owner; ;~0~5o0{-K
            this.comboBox1.Items.Add(fm.Str); /A:Q%l+P&f!D'G
        } "_#l9_0@3p"[$Y+w
tech.techweb.com.cn5O"]0P6x)O @'r0\;n1x
这里的运行结果只有一个Item:COM2,实际上有2个(COM1和COM2).
3S0B u:m5f"q不知道该怎么办.

引用 回复 顶部
游客
未注册









发表于 2008-9-4 12:03
是不是要用到范型?

引用 回复 顶部
游客
未注册









发表于 2008-9-4 12:03
C# code

for (int i = 0; i < comArray.Length; i++)
            {
                this.str = comKey.GetValue(comArray).ToString(); //这里不知道该怎么写.我这种写发只能传最后一个字符串给子窗体.
            }



关键在这里 你只能将comArray最后一个赋给str

为何不弄一个 string[] 的属性呢 然后在子窗体foreach 添加到comboBox1

引用 回复 顶部
游客
未注册









发表于 2008-9-4 12:03
for (int i = 0; i < comArray.Length; i++)
{
    this.str = comKey.GetValue(comArray).ToString(); //我的目的是把所有的字符串传递给子窗体.???
}

引用 回复 顶部
游客
未注册









发表于 2008-9-4 12:03
不是,简单的思路应该是
childForm cf = new childForm();
//在这里调用childForm 中ADDITEM(str)
cf.ShowDialog(this);


你在childform中写个公开的委托方法

delegate void addstr(string str)

public void  ADDITEM(string str)
{
if(comboBox1.invokerequered)
{
....跨线程委托调用方法
}
else
{
comboBox1.Items.Add(fm.Str);
}
}

引用 回复 顶部
游客
未注册









发表于 2008-9-4 12:03
C# code  private string[] str;
        public string[] Str
        {
            get { return str; }
            set { this.str = value; }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            RegistryKey hklm = Registry.LocalMachine;
            RegistryKey comKey = hklm.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");
            str = comKey.GetValueNames();
            childForm cf = new childForm();
            cf.ShowDialog(this);
        }
子窗体:

        //子窗体的Form_Load事件
        private void childForm_Load(object sender, EventArgs e)
        {
            Form1 fm = (Form1)this.Owner;
            foreach(string s in fm.Str){
this.comboBox1.Items.Add(s);
            }
         
        }

引用 回复 顶部
游客
未注册









发表于 2008-9-4 12:04
C# code

  private string[] str;
        public string[] Str
        {
            get { return str; }
            set { this.str = value; }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            RegistryKey hklm = Registry.LocalMachine;
            RegistryKey comKey = hklm.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");
            str = comKey.GetValueNames();
            childForm cf = new childForm();
            cf.ShowDialog(this);
        }
子窗体:

        //子窗体的Form_Load事件
        private void childForm_Load(object sender, EventArgs e)
        {
            Form1 fm = (Form1)this.Owner;
            foreach(string s in fm.Str){
this.comboBox1.Items.Add(s);
            }

引用 回复 顶部
游客
未注册









发表于 2008-9-4 12:04
子窗体加一个成员变量:

从主窗体来的数据类型 变量名;

给子窗口添个带参数的构造函数

public ChildForm(要传数据的类型 参数名)
{
  变量名=参数名;
}

这样数据就传过来了,随便什么类型的数据都可以。

引用 回复 顶部
游客
未注册









发表于 2008-9-4 12:04
for (int i = 0; i < comArray.Length; i++)
{
    this.str = comKey.GetValue(comArray).ToString(); //我的目的是把所有的字符串传递给子窗体.???
}
----->>
for(int i=0;i <comArray.Length;i++)
{
this.str+=comkey.GetValue(comArray).ToString();
}

引用 回复 顶部
游客
未注册









发表于 2008-9-4 12:04
this.str 只是唯一的变量,在循环中,新的值会覆盖旧的

引用 回复 顶部
查看积分策略说明快速回复主题
选项 标题 Smilies
禁用 URL 识别
禁用 Smilies
禁用 Discuz!代码
使用匿名发帖
使用个人签名
接收新回复邮件通知
内容





当前时区 GMT+8, 现在时间是 2008-11-23 08:39
京ICP证060517号

本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 © 2001-2008 Comsenz Inc.
Processed in 0.035770 second(s), 7 queries

清除 Cookies - 联系我们 - TechWeb.com.cn - Archiver - WAP