求助:Winform窗体间传值 实践。拜谢老师大侠!!!

问题描述

求助:Winform窗体间传值实践。拜谢老师大侠!!!关于Winform窗体传值,读到happy09li的《C#窗体间传值方法大汇总》(http://bbs.csdn.net/topics/390128592),作为新手,想按照这个“大汇总”,逐一实践一下这些传值方法,以更好理解代码。求论坛上的老师大侠辅助俺的实践,学生不胜感激!!!作揖!!!俺的举例代码:评分系统,运行过程是这样的:运行→出现listView的Emp窗体→双击其中的一行→跳转到“评分”窗体GetScore→填充评分→“确定”后→Emp窗体有了更新(即:有了评分的值)代码下载:http://pan.baidu.com/s/1ntsKwQ1我的逐一实践:方式1.(代码中-项目:Emplist)已经实现了主窗体建静态“类变量”实现主窗体对象传值(其实,这是听课时,老师做的)。方式2.(代码中-项目:Test2)用“全局类”,求老师大侠辅助,感谢中!我做了:1)将InitData()放到了Employee类中。2)建立一个Commen类-作为“全局类”,作为存储主窗体的容器,或者说是代替方式1的静态“类变量”。不知这样做对否?现在出现问题:1)初始化数据(InitData()),添加了3个,但窗体却只能显示1个数据,我逐步调试,看到Employee之InitData()的returnd泛型集合emps中有三个值,但窗体却只能显示一个值,不知哪里出错了?2)在窗体GetScore-填充评分→确定后,Emp窗体没有更新。逐步调试,发现:当运行到-窗体GetScore-填充评分→点“确定”→调用Commen.emp.BindList();,此时emp中的集合emps里有更新的Assess和Score的值→并且Emp窗体中BindList()里的集合emps也有更新的Assess和Score的值,注意是在没有进行emps=emp.InitData();之前,一旦走到了emps=emp.InitData();,则没有了上述更新的值。纠结:再次绑定时,如何让集合emps保持更新的值,把更新的值绑定到listView上呢?

解决方案

解决方案二:
namespaceTest2{publicpartialclassEmp:Form//Emp窗体即主窗体{publicEmp(){InitializeComponent();Commenco=newCommen(this);}Employeeemp=newEmployee();privatevoidEmp_Load(objectsender,EventArgse){emp.InitData();BindList();}List<Employee>emps=null;publicvoidBindList(){emps=emp.InitData();//没走到“=”时,集合emps中有更新的Assess和Score的值值,但“=”后就没有了。//清空ListView中的所有项listView1.Items.Clear();//如何将集合中的数据绑定到LIstVIew//ListView中每一项都是ListViewItemforeach(Employeeiteminemps){ListViewItemlv=newListViewItem();lv.Text=item.ID;//SubItems是每一项的对应的列//lv.SubItems.Add(emps[i].ID);lv.SubItems.Add(item.Name);lv.SubItems.Add(item.Age.ToString());lv.SubItems.Add(item.Assess);lv.SubItems.Add(item.Score.ToString());listView1.Items.Add(lv);break;//没有break会不停地循环添加}}privatevoidlistView1_DoubleClick(objectsender,EventArgse){//如何将Emp窗体中的员工数组中的员工信息读取到GetScore窗体中?//找到当前用户选中的员工stringid=listView1.SelectedItems[0].Text;//必须循环遍历整个数据,将数组中的每个员工的编号与选中的员工编号//比较,如果一致,则将该员工的信息传递到GetScore中intindex=0;//定义一个变量保存选中员工在数组中的位置//Employeeem=newEmployee();//有这句则79行(emp=emps[index])会出错:超出索引范围。//List<Employee>emps=emp.InitData();foreach(Employeeiteminemps){if(item.ID==id){index=int.Parse(id);break;//return不能用return}}//获取到了选中的对象emp=emps[index];//建立Emp窗体和GetScore窗体数据传递GetScorefrm=newGetScore();frm.emplist=emp;//把Emp窗体的Employee类对象的值传递给GetScore窗体的Employee类对象frm.Show();}privatevoidlistView1_SelectedIndexChanged(objectsender,EventArgse){}privatevoidlistView1_ItemActivate(objectsender,EventArgse){}}}

======================namespaceTest2{publicpartialclassGetScore:Form//GetScore评分窗体{publicGetScore(){InitializeComponent();}publicEmployeeemplist;privatevoidGetScore_Load(objectsender,EventArgse){txtName.Text=emplist.Name;txtAssess.Text=emplist.Assess;txtScore.Text=emplist.Score.ToString();}privatevoidbtnScore_Click(objectsender,EventArgse){emplist.Assess=txtAssess.Text;emplist.Score=Convert.ToInt32(txtScore.Text);Commen.emp.BindList();//emp中有集合emps的更新值this.Close();}}}

====================namespaceTest2{publicclassEmployee//Employee类{publicstringID{get;set;}publicstringName{get;set;}publicintAge{get;set;}publicstringAssess{get;set;}publicintScore{get;set;}List<Employee>emps=newList<Employee>{};publicList<Employee>InitData(){Employeee1=newEmployee();e1.ID="001";e1.Name="张三";e1.Age=18;emps.Add(e1);Employeee2=newEmployee();e2.ID="002";e2.Name="王五";e2.Age=18;emps.Add(e2);Employeee3=newEmployee();e3.ID="003";e3.Name="李四";e3.Age=18;emps.Add(e3);returnemps;//有上面赋的3个值}}}

======================namespaceTest2{classCommen//Commen类{//publicstaticEmployeeemployist=null;publicstaticEmpemp=null;publicstaticEmployeeemploy=null;publicCommen(Empem){emp=em;}}}

解决方案三:
http://bbs.csdn.net/topics/360140208
解决方案四:
该回复于2014-02-11 00:06:20被版主删除
解决方案五:
引用2楼devmiao的回复:

http://bbs.csdn.net/topics/360140208

俺看过caozhy老师的这个帖子,后面会逐一地去实践,到时期待caozhy老师给予指点帮助。先从自己的理解能力,一步一步地实践吧,谢谢!!!
解决方案六:
不懂3楼是啥意思?
解决方案七:
啥意思呀,不太明白
解决方案八:
引用6楼xujingchen1的回复:

啥意思呀,不太明白

想练习窗体间的传值。有多种方法,我先开始从通过“全局类”方法来实现窗体间传值,但碰到问题(见1楼),求助老师帮助。
解决方案九:
#1好有耐心,膜拜!
解决方案十:
求老师指点,学生拜谢万分!!!
解决方案十一:
主要你写的太长了,太多了,大多数人都看不下去。挑重点说!
解决方案十二:
引用10楼danding_ge的回复:

主要你写的太长了,太多了,大多数人都看不下去。挑重点说!

感谢danding_ge老师回复!!!现在出现问题:      1)初始化数据(InitData()),添加了3个,但窗体却只能显示1个数据,我逐步调试,看到Employee之     InitData() 的 return d 泛型集合emps中有三个值,但窗体却只能显示一个值,不知哪里出错了?   2)在窗体GetScore - 填充评分 → 确定后,Emp 窗体 没有更新。 逐步调试,发现:当运行到 - 窗体GetScore - 填充评分 → 点“确定”→ 调用Commen.emp.BindList();,此时emp中的集合emps里有更新的Assess 和 Score的值 → 并且 Emp 窗体中 BindList() 里的 集合emps 也有更新的Assess 和 Score的值,注意 是在没有 进行 emps = emp.InitData();之前,一旦走到了emps = emp.InitData();,则没有了上述更新的值。纠结:再次绑定时,如何让集合emps保持更新的值,把更新的值绑定到listView上呢?
解决方案十三:
break;//没有break会不停地循环添加

去掉试试
解决方案十四:
评分系统图书(怕1楼文字太多,用图示更好的读进俺的帖子)。麻烦版主老师,能否把该贴移至我的5楼,多谢您的帮助关照!!!
解决方案十五:
引用12楼danding_ge的回复:

break;//没有break会不停地循环添加

去掉试试

去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成3xN多次个值
解决方案:
这种窗体传值,可以用委托+事件的方式来做
解决方案:
如果有新手,与我有同样的练习实践需要的码友,不妨我们大家一起做一下。
解决方案:
引用15楼justindreams的回复:

这种窗体传值,可以用委托+事件的方式来做

嗯,俺读到了相关老师的帖子。只是,俺初学,想逐个实践一下,先从俺最容易理解的“全局类”着手,希望老师给予指点,不胜感激。
解决方案:
引用14楼u011620649的回复:

Quote: 引用12楼danding_ge的回复:
break;//没有break会不停地循环添加

去掉试试

去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成3xN多次个值

不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。
解决方案:
引用18楼danding_ge的回复:

Quote: 引用14楼u011620649的回复:
Quote: 引用12楼danding_ge的回复:
break;//没有break会不停地循环添加

去掉试试

去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成3xN多次个值

不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。

谢谢Afresh-Klo老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误也还有其他的问题,所以误判是因为没加break)。但注释掉break,却又出现了错误“索引超出范围”(附上图)。泛型集合应该不能有索引错误把。
解决方案:
#19楼问题已解决,很有成就感,芝麻大的进步。
解决方案:
现在的问题是#1楼的第二个问题:   2)在窗体GetScore - 填充评分 → 确定后,Emp 窗体 没有更新。 逐步调试,发现:当运行到 - 窗体GetScore - 填充评分 → 点“确定”→ 调用Commen.emp.BindList();,此时emp中的集合emps里有更新的Assess 和 Score的值 → 并且 Emp 窗体中 BindList() 里的 集合emps 也有更新的Assess 和 Score的值,注意 是在没有 进行 emps = emp.InitData();之前,一旦走到了emps = emp.InitData();,则没有了上述更新的值。纠结:再次绑定时,如何让集合emps保持更新的值,把更新的值绑定到listView上呢?
解决方案:
引用19楼u011620649的回复:

Quote: 引用18楼danding_ge的回复:
Quote: 引用14楼u011620649的回复:
Quote: 引用12楼danding_ge的回复:
break;//没有break会不停地循环添加

去掉试试

去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成3xN多次个值

不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。

谢谢Afresh-Klo老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误也还有其他的问题,所以误判是因为没加break)。但注释掉break,却又出现了错误“索引超出范围”(附上图)。泛型集合应该不能有索引错误把。

你那句加了break的循环,其实就只循环了一次就退出了,所以你发现每次都只有一条数据,就是这个原因的。越界的事,你要看emps是不是一个空的list
解决方案:

解决方案:
引用22楼dxy0613的回复:

Quote: 引用19楼u011620649的回复:
Quote: 引用18楼danding_ge的回复:
Quote: 引用14楼u011620649的回复:
Quote: 引用12楼danding_ge的回复:
break;//没有break会不停地循环添加

去掉试试

去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成3xN多次个值

不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。

谢谢Afresh-Klo老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误也还有其他的问题,所以误判是因为没加break)。但注释掉break,却又出现了错误“索引超出范围”(附上图)。泛型集合应该不能有索引错误把。

你那句加了break的循环,其实就只循环了一次就退出了,所以你发现每次都只有一条数据,就是这个原因的。越界的事,你要看emps是不是一个空的list

这个问题,俺已经解决了(#20楼)。index=int.Parse(id)-1;--减一就可以。十分感谢您的点拨!!!再拜求您帮忙指点一下#23楼的问题,好吗,拜谢游牧小小诗人老师!
解决方案:
引用22楼dxy0613的回复:

Quote: 引用19楼u011620649的回复:
Quote: 引用18楼danding_ge的回复:
Quote: 引用14楼u011620649的回复:
Quote: 引用12楼danding_ge的回复:
break;//没有break会不停地循环添加

去掉试试

去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成3xN多次个值

不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。

谢谢Afresh-Klo老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误也还有其他的问题,所以误判是因为没加break)。但注释掉break,却又出现了错误“索引超出范围”(附上图)。泛型集合应该不能有索引错误把。

你那句加了break的循环,其实就只循环了一次就退出了,所以你发现每次都只有一条数据,就是这个原因的。越界的事,你要看emps是不是一个空的list

好吧,我错了,越界是因为你的数组下标是0开始,而你的工号是从1开始的,读取工号3的时候,数组中是不存在的,就越界了。
解决方案:
Commen.emp.BindList();//emp中有集合emps的更新值这一句,不明白你的用意,为什么你又重新初始化了一次这个emp,你是想让listView重新加载是吧,如果整个列表数据很多很多的情况下,重新加载会很伤的。你可以想办法单独修改某行的子项的值。就像软件的界面设计一样,尽量不重画整个软件界面,
解决方案:
引用26楼dxy0613的回复:

Commen.emp.BindList();//emp中有集合emps的更新值这一句,不明白你的用意,为什么你又重新初始化了一次这个emp,你是想让listView重新加载是吧,如果整个列表数据很多很多的情况下,重新加载会很伤的。你可以想办法单独修改某行的子项的值。就像软件的界面设计一样,尽量不重画整个软件界面,

您是指→emps = emp.InitData(); 吗?我也纠结在这里,不知应该如何修改?应该如何修改呢?非常感谢您的指导!!!publicvoidBindList(){emps=emp.InitData();//没走到“=”时,集合emps中有更新的Assess和Score的值值,但“=”后就没有了。//清空ListView中的所有项listView1.Items.Clear();//如何将集合中的数据绑定到LIstVIew//ListView中每一项都是ListViewItemforeach(Employeeiteminemps){ListViewItemlv=newListViewItem();lv.Text=item.ID;//SubItems是每一项的对应的列//lv.SubItems.Add(emps[i].ID);lv.SubItems.Add(item.Name);lv.SubItems.Add(item.Age.ToString());lv.SubItems.Add(item.Assess);lv.SubItems.Add(item.Score.ToString());listView1.Items.Add(lv);}}
解决方案:
引用27楼u011620649的回复:

Quote: 引用26楼dxy0613的回复:
Commen.emp.BindList();//emp中有集合emps的更新值这一句,不明白你的用意,为什么你又重新初始化了一次这个emp,你是想让listView重新加载是吧,如果整个列表数据很多很多的情况下,重新加载会很伤的。你可以想办法单独修改某行的子项的值。就像软件的界面设计一样,尽量不重画整个软件界面,

您是指→emps = emp.InitData(); 吗?我也纠结在这里,不知应该如何修改?应该如何修改呢?非常感谢您的指导!!!publicvoidBindList(){emps=emp.InitData();//没走到“=”时,集合emps中有更新的Assess和Score的值值,但“=”后就没有了。//清空ListView中的所有项listView1.Items.Clear();//如何将集合中的数据绑定到LIstVIew//ListView中每一项都是ListViewItemforeach(Employeeiteminemps){ListViewItemlv=newListViewItem();lv.Text=item.ID;//SubItems是每一项的对应的列//lv.SubItems.Add(emps[i].ID);lv.SubItems.Add(item.Name);lv.SubItems.Add(item.Age.ToString());lv.SubItems.Add(item.Assess);lv.SubItems.Add(item.Score.ToString());listView1.Items.Add(lv);}}

我的想法是再写一个方法,参数为一个行号,内容就是取ListView的某行的LitsViewItem实例,然后再读取emp这行的新的数据,进行重新写这一行,就可以不用再调用bind_list了。哈哈哈,和你一样是新手,今天也弄了个两个窗口传数据的,我用的是给构造函数添加一个ref参数,然后修改完再更新界面。总之,我们的目的是把这个窗口声明的一个变量的地址传到另一个窗口,这样就可以在那边修改了,怎么传都可以。
解决方案:
谢谢游牧小小诗人老师的点拨!!!我试试您的方法。我之前所学到的,好像更新数据,都是调用绑定方法,重新绑定,获得更新。如果仍然这样做,应该怎样修改获得更新呢?
解决方案:
引用29楼u011620649的回复:

谢谢游牧小小诗人老师的点拨!!!我试试您的方法。我之前所学到的,好像更新数据,都是调用绑定方法,重新绑定,获得更新。如果仍然这样做,应该怎样修改获得更新呢?

告诉更新函数,你要更新哪一块的东西,想办法实现这个
解决方案:
谢谢游牧小小诗人 老师!!!俺试试
解决方案:
哈哈哈,和你一样是新手,今天也弄了个两个窗口传数据的,我用的是给构造函数添加一个ref参数,然后修改完再更新界面。 总之,我们的目的是把这个窗口声明的一个变量的地址传到另一个窗口,这样就可以在那边修改了,怎么传都可以。==============咱们一起做一下,咋样?握手
解决方案:
引用32楼u011620649的回复:

哈哈哈,和你一样是新手,今天也弄了个两个窗口传数据的,我用的是给构造函数添加一个ref参数,然后修改完再更新界面。 总之,我们的目的是把这个窗口声明的一个变量的地址传到另一个窗口,这样就可以在那边修改了,怎么传都可以。==============咱们一起做一下,咋样?握手

你这是在闹哪样啊?
解决方案:
引用33楼danding_ge的回复:

Quote: 引用32楼u011620649的回复:
哈哈哈,和你一样是新手,今天也弄了个两个窗口传数据的,我用的是给构造函数添加一个ref参数,然后修改完再更新界面。 总之,我们的目的是把这个窗口声明的一个变量的地址传到另一个窗口,这样就可以在那边修改了,怎么传都可以。==============咱们一起做一下,咋样?握手

你这是在闹哪样啊?

我的意思是(见#16楼),如果有新手,也想练练窗体传值,不妨一起做一下俺的这2个窗体,大家切磋互相帮助启发,不是挺好的事吗。happy09li老师(帖子C#窗体间传值方法大汇总)看到有新手练习他的帖子方法,也会很高兴吧。对您的关注和指导,俺再次表示由衷的感谢!!!
解决方案:
引用21楼u011620649的回复:

现在的问题是#1楼的第二个问题:   2)在窗体GetScore - 填充评分 → 确定后,Emp 窗体 没有更新。 逐步调试,发现:当运行到 - 窗体GetScore - 填充评分 → 点“确定”→ 调用Commen.emp.BindList();,此时emp中的集合emps里有更新的Assess 和 Score的值 → 并且 Emp 窗体中 BindList() 里的 集合emps 也有更新的Assess 和 Score的值,注意 是在没有 进行 emps = emp.InitData();之前,一旦走到了emps = emp.InitData();,则没有了上述更新的值。纠结:再次绑定时,如何让集合emps保持更新的值,把更新的值绑定到listView上呢?

既然有更新,把emps = emp.InitData();去掉就行了撒
解决方案:
引用35楼danding_ge的回复:

Quote: 引用21楼u011620649的回复:
现在的问题是#1楼的第二个问题:   2)在窗体GetScore - 填充评分 → 确定后,Emp 窗体 没有更新。 逐步调试,发现:当运行到 - 窗体GetScore - 填充评分 → 点“确定”→ 调用Commen.emp.BindList();,此时emp中的集合emps里有更新的Assess 和 Score的值 → 并且 Emp 窗体中 BindList() 里的 集合emps 也有更新的Assess 和 Score的值,注意 是在没有 进行 emps = emp.InitData();之前,一旦走到了emps = emp.InitData();,则没有了上述更新的值。纠结:再次绑定时,如何让集合emps保持更新的值,把更新的值绑定到listView上呢?

既然有更新,把emps = emp.InitData();去掉就行了撒

感谢Afresh-Klo老师回复!!!去掉这行代码,出现如下错误:
解决方案:
关于上面#36楼问题,比较本类中的listView1_DoubleClick(objectsender,EventArgse):
解决方案:
没赋值啊,当然不行,你后面的已经复制了呀=。=Employeeemp=newEmployee();List<Employee>emps=null;publicEmp(){InitializeComponent();Commenco=newCommen(this);}privatevoidEmp_Load(objectsender,EventArgse){emps=emp.InitData();BindList();}

解决方案:
引用38楼danding_ge的回复:

没赋值啊,当然不行,你后面的已经复制了呀=。=Employeeemp=newEmployee();List<Employee>emps=null;publicEmp(){InitializeComponent();Commenco=newCommen(this);}privatevoidEmp_Load(objectsender,EventArgse){emps=emp.InitData();BindList();}

万分感谢Afresh-Klo老师!!!经您的修改,主窗体Emp成功更新了。但我还没明白为什么,我要好好想想一下,纠结的地方还要麻烦您点拨啊!!!
解决方案:
privateEmployeeemp=newEmployee();//别的类用不到的变量及函数设为私有。privateList<Employee>emps=null;//将全局变量的声明都置于函数顶端方便管理。publicEmp(){InitializeComponent();Commenco=newCommen(this);}privatevoidEmp_Load(objectsender,EventArgse){emps=emp.InitData();//这句将初始化赋值给emps,这样才是真正的初始化,因为你后面用的都是emps而不是emp,所以只是执行emp.InitData()没什么意义。BindList();}publicvoidBindList(){//emps=emp.InitData();//这句将emps重新赋值了,所以你窗体传过来的数据被刷新了,因为你InitData里面的赋值是常量,固定的,所以每次执行BindList都会重新赋值成初始值。listView1.Items.Clear();foreach(Employeeiteminemps){ListViewItemlv=newListViewItem();lv.Text=item.ID;lv.SubItems.Add(item.Name);lv.SubItems.Add(item.Age.ToString());lv.SubItems.Add(item.Assess);lv.SubItems.Add(item.Score.ToString());listView1.Items.Add(lv);}}

看看这个(我刚刚发表的,还在修改)希望对你有所帮助。
解决方案:
引用40楼danding_ge的回复:

privateEmployeeemp=newEmployee();//别的类用不到的变量及函数设为私有。privateList<Employee>emps=null;//将全局变量的声明都置于函数顶端方便管理。publicEmp(){InitializeComponent();Commenco=newCommen(this);}privatevoidEmp_Load(objectsender,EventArgse){emps=emp.InitData();//这句将初始化赋值给emps,这样才是真正的初始化,因为你后面用的都是emps而不是emp,所以只是执行emp.InitData()没什么意义。BindList();}publicvoidBindList(){//emps=emp.InitData();//这句将emps重新赋值了,所以你窗体传过来的数据被刷新了,因为你InitData里面的赋值是常量,固定的,所以每次执行BindList都会重新赋值成初始值。listView1.Items.Clear();foreach(Employeeiteminemps){ListViewItemlv=newListViewItem();lv.Text=item.ID;lv.SubItems.Add(item.Name);lv.SubItems.Add(item.Age.ToString());lv.SubItems.Add(item.Assess);lv.SubItems.Add(item.Score.ToString());listView1.Items.Add(lv);}}

看看这个(我刚刚发表的,还在修改)希望对你有所帮助。

感谢Afresh-Klo老师!!!我要好好理解一下。俺已经收藏了您的C#编程规范,钦佩您的无私奉献精神!!!
解决方案:
Afresh-Klo 老师,求教您:1.#23楼的问题,为啥没有赋上值呢?2.“你后面的已经复制了呀=”(Afresh-Klo 老师#38楼贴),意思是listView1_DoubleClick(objectsender,EventArgse)里面已经“赋值”了?是哪句代码起了作用?衷心感谢您!!!
解决方案:
我想搞清楚俺错在了哪里
解决方案:
引用42楼u011620649的回复:

Afresh-Klo 老师,求教您:1.#23楼的问题,为啥没有赋上值呢?2.“你后面的已经复制了呀=”(Afresh-Klo 老师#38楼贴),意思是listView1_DoubleClick(objectsender,EventArgse)里面已经“赋值”了?是哪句代码起了作用?衷心感谢您!!!

幸好我又看了一眼这个帖子,你咋不添加上引用呢?先看emp.InitData()这个方法里面就是赋初值,23#的问题不是没有赋值成功,而是你赋值还是传的原来的值,这是由你InitData()这个方法决定的,你快看看这里面的emps是不是固定的值呀?但是把emps=emp.InitData()去掉后,emps就没有值了,因为你声明的时候是null。所以把emps=emp.InitData()放到初始化中,这样既赋了初值,也不影响BindList的功能。之所以你会有这么多错误及不规范,且自己还不明白怎么回事,是因为基础不好,先去学习C#基础语法。第二个问题,因为emps声明的是全局变量,就是整个类里面都可以调用的变量,所以第一次赋值以后,在类中任何地方调用都会有值,赋值的语句还是emps=emp.InitData(),在你修改前后都有这句,所以他一直是有值的。如果不了解程序运行过程,在初始化后面F9加断点,F10一步步调试查看即可。基础太差,先去学基础,不然总是会有这种小问题。
解决方案:
感谢Afresh-Klo老师#44楼的回复。俺要仔细读读,理解。俺基础差,必须加大基础练习,弄懂为什么错。还需要老师帮助指导点拨,拜谢!!!
解决方案:
引用44楼danding_ge的回复:

Quote: 引用42楼u011620649的回复:
Afresh-Klo 老师,求教您:1.#23楼的问题,为啥没有赋上值呢?2.“你后面的已经复制了呀=”(Afresh-Klo 老师#38楼贴),意思是listView1_DoubleClick(objectsender,EventArgse)里面已经“赋值”了?是哪句代码起了作用?衷心感谢您!!!

幸好我又看了一眼这个帖子,你咋不添加上引用呢?先看emp.InitData()这个方法里面就是赋初值,23#的问题不是没有赋值成功,而是你赋值还是传的原来的值,这是由你InitData()这个方法决定的,你快看看这里面的emps是不是固定的值呀?但是把emps=emp.InitData()去掉后,emps就没有值了,因为你声明的时候是null。所以把emps=emp.InitData()放到初始化中,这样既赋了初值,也不影响BindList的功能。之所以你会有这么多错误及不规范,且自己还不明白怎么回事,是因为基础不好,先去学习C#基础语法。第二个问题,因为emps声明的是全局变量,就是整个类里面都可以调用的变量,所以第一次赋值以后,在类中任何地方调用都会有值,赋值的语句还是emps=emp.InitData(),在你修改前后都有这句,所以他一直是有值的。如果不了解程序运行过程,在初始化后面F9加断点,F10一步步调试查看即可。基础太差,先去学基础,不然总是会有这种小问题。

Afresh-Klo老师,求教您:
解决方案:
我问你呀~Emp_Load是在什么时候执行的?BindList是在什么时候执行的?listView1_DoubleClick又是什么时候执行的?他们三个你给排个序看看。
解决方案:
引用47楼danding_ge的回复:

我问你呀~Emp_Load是在什么时候执行的?BindList是在什么时候执行的?listView1_DoubleClick又是什么时候执行的?他们三个你给排个序看看。

万分感激Afresh-Klo老师的点拨指导,我恍然大悟,豁然开朗了。我明白了,分析代码执行顺序非常重要。这三个东东执行顺序是:Emp-Load→BindList()→listView1_DoubleClick。当执行BindList()时,privateList<Employee>emps的值是空,还没有值,所以此时运行BindList(),程序就出错(没NEW),所以必须在BindList()里面实例化emps=emp.InitData();而上面之后,运行listView1_DoubleClick时,privateList<Employee>emps已经有值,所以在listView1_DoubleClick里面的Emps就没有出错。今天俺又进步啦
解决方案:
引用48楼u011620649的回复:

Quote: 引用47楼danding_ge的回复:
我问你呀~Emp_Load是在什么时候执行的?BindList是在什么时候执行的?listView1_DoubleClick又是什么时候执行的?他们三个你给排个序看看。

万分感激Afresh-Klo老师的点拨指导,我恍然大悟,豁然开朗了。我明白了,分析代码执行顺序非常重要。这三个东东执行顺序是:Emp-Load→BindList()→listView1_DoubleClick。当执行BindList()时,privateList<Employee>emps的值是空,还没有值,所以此时运行BindList(),程序就出错(没NEW),所以必须在BindList()里面实例化emps=emp.InitData();而上面之后,运行listView1_DoubleClick时,privateList<Employee>emps已经有值,所以在listView1_DoubleClick里面的Emps就没有出错。今天俺又进步啦

嗯,有一点需要注意,这里你实例化emps=emp.InitData();应该放在初始化中,如果放在BindList()里面可能还会影响传值。
解决方案:
引用49楼danding_ge的回复:

Quote: 引用48楼u011620649的回复:
Quote: 引用47楼danding_ge的回复:
我问你呀~Emp_Load是在什么时候执行的?BindList是在什么时候执行的?listView1_DoubleClick又是什么时候执行的?他们三个你给排个序看看。

万分感激Afresh-Klo老师的点拨指导,我恍然大悟,豁然开朗了。我明白了,分析代码执行顺序非常重要。这三个东东执行顺序是:Emp-Load→BindList()→listView1_DoubleClick。当执行BindList()时,privateList<Employee>emps的值是空,还没有值,所以此时运行BindList(),程序就出错(没NEW),所以必须在BindList()里面实例化emps=emp.InitData();而上面之后,运行listView1_DoubleClick时,privateList<Employee>emps已经有值,所以在listView1_DoubleClick里面的Emps就没有出错。今天俺又进步啦

嗯,有一点需要注意,这里你实例化emps=emp.InitData();应该放在初始化中,如果放在BindList()里面可能还会影响传值。

谢谢Afresh-Klo老师诲人不倦的崇高精神!!!

时间: 2025-01-31 07:39:26

求助:Winform窗体间传值 实践。拜谢老师大侠!!!的相关文章

winform窗体间传值

窗体间传值要弄清楚到底是哪个对象的问题,否则容易传错值.就比如窗体对象loginFrm为登陆窗体,想把当前的登陆用户信息传递给主窗体mainFrm,但是却实例了一个新的对象loginFrm把里头的信息传递给了mainFrm,所以得到了一空值,颇有刻舟求剑的味道,不同的内存空间就比如湖水的宽广一样,存放着不同的对象,彼此要分清楚.窗体传值的前提是,要传的字段,在类里面的访问修饰符必须是public(如果在源窗体内传值则例外,参见下列常用方法2).常用的方法: 1.    静态变量,在窗体里Clas

C# Winform窗体间传值

1.通过构造函数 特点:传值是单向的(不可以互相传值),实现简单 实现代码如下: 在窗体Form2中 int value1; string value2; public Form2 ( int value1 , string value2 ) {     InitializeComponent ( );     this.value1 = value1;     this.value2 = value2; } 在窗体Form1中这样调用 new Form2 ( 111 , "222"

窗体间传值出问题

问题描述 有没有人碰到过这种情况,,窗体间单项数组值传递,明明已经显示接受到数据,,但是在timer中应用时候,,却发现是Null,这是咋回事比如,在一个窗体里,publicpartialclassMainInterfaceForm:Form{privatestringAuth;publicstring[]OPCreader;publicMainInterfaceForm(stringAuthority,string[]MfaceOPCread)if(MfaceOPCread!=null){OP

ASP.NET 窗体间传值的方法

这篇文章介绍了ASP.NET 窗体间传值的方法,有需要的朋友可以参考一下,希望对你有所帮助   假设ParentForm.aspx 页面上有TextBox1文本框和Open按钮 点击Open按钮弹出SubForm.aspx,SubForm.aspx页面上有TextBox1文本框和Close按钮 点击Close按钮关闭SubForm.aspx页面,并把子页面SubForm.aspx文本框的值显示到父页面ParentForm.aspx 的文本框上. 父窗体前台代码: 复制代码 代码如下:      

WinForm窗体显示和窗体间传值总结

WinForm 2009-02-10 10:47:47 阅读50 评论0 字号:大中小 A.WinForm中窗体显示 显示窗体可以有以下2种方法: Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 两者具体区别如下: 1.在调用Form.Show方法后,Show方法后面的代码会立即执行 2.在调用Form.ShowDialog方法后,直到关闭对话框后,才执行此方法后面的代码 3.当窗体显示为模式窗体时,单击"关闭"按钮会隐藏窗

ASP.NET 窗体间传值实现方法

 假设ParentForm.aspx 页面上有TextBox1文本框和Open按钮 点击Open按钮弹出SubForm.aspx,SubForm.aspx页面上有TextBox1文本框和Close按钮 点击Close按钮关闭SubForm.aspx页面,并把子页面SubForm.aspx文本框的值显示到父页面ParentForm.aspx 的文本框上. 父窗体前台代码:    代码如下         <script type="text/javascript">     

ASP.NET 窗体间传值实现方法详解

假设ParentForm.aspx 页面上有TextBox1文本框和Open按钮 点击Open按钮弹出SubForm.aspx,SubForm.aspx页面上有TextBox1文本框和Close按钮 点击Close按钮关闭SubForm.aspx页面,并把子页面SubForm.aspx文本框的值显示到父页面ParentForm.aspx 的文本框上. 父窗体前台代码:    代码如下 复制代码       <script type="text/javascript">   

C#局域网聊天工具制作系列讲座(3)_窗体间传值

问题描述 启动主程序时,同时启动UDP的监听,这时应该使用集合来做为消息队列的缓存,以便用户能在任何时候浏览到消息.这个集合一般在主程序中定义,而用户接受消息,一般我们会弹出窗口给用户来浏览消息,以及在新窗口中回复消息,那如何将主窗口中的消息,传递到消息显示窗体中呢?如何是Web(ASP.net)我们可以封装到form中传值,或者request传值,甚至可以在URL中接参数直接传值,而winform中窗体传值以上方法就都不在能用了.在windowsform之间传值,我总结了有四个方法:全局变量.

c# 窗体间传值-为什么窗体中公开的属性,别的窗体不能调用??

问题描述 为什么窗体中公开的属性,别的窗体不能调用?? 以下是部分代码: private void tslSearch_Click(object sender, EventArgs e) { Form f = new Search(tn); f.Infos-- } 调用的窗体作用是设置搜索条件并返回搜索结果,部分代码如下: public partial class Search : Form { private TableName tn = TableName.企业信息; private str