问题描述
求助: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老师诲人不倦的崇高精神!!!