namespace Test2
{
public partial class Emp : Form //Emp窗体 即 主窗体
{
public Emp()
{
InitializeComponent();
Commen co = new Commen(this); } Employee emp = new Employee();
private void Emp_Load(object sender, EventArgs e)
{
emp.InitData();
BindList();
}
List<Employee> emps=null ;
public void BindList( )
{
emps = emp.InitData(); // 没走到 “=”时,集合emps中 有更新的Assess 和 Score的值值,但“=”后就没有了。
//清空ListView中的所有项
listView1.Items.Clear();
//如何将集合中的数据绑定到LIstVIew
//ListView中每一项都是ListViewItem
foreach ( Employee item in emps)
{
ListViewItem lv = new ListViewItem(); 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 会不停地 循环添加
}
} private void listView1_DoubleClick(object sender, EventArgs e)
{
//如何将Emp窗体中的员工数组中的员工信息读取到GetScore窗体中?
//找到当前用户选中的员工
string id = listView1.SelectedItems[0].Text;
//必须循环遍历整个数据,将数组中的每个员工的编号与选中的员工编号
//比较,如果一致,则将该员工的信息传递到GetScore中 int index = 0;//定义一个变量保存选中员工在数组中的位置 // Employee em = new Employee();//有这句 则79行(emp = emps[index]) 会出错:超出索引范围。
//List<Employee > emps = emp.InitData();
foreach (Employee item in emps)
{
if (item.ID == id)
{
index = int.Parse(id);
break;
//return 不能用return
}
}
//获取到了选中的对象
emp = emps[index]; //建立 Emp窗体 和 GetScore窗体 数据传递
GetScore frm = new GetScore();
frm.emplist = emp; // 把 Emp窗体 的 Employee类对象的值 传递给 GetScore窗体 的 Employee类对象
frm.Show();
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{ } private void listView1_ItemActivate(object sender, EventArgs e)
{ }
}
}
======================namespace Test2
{
public partial class GetScore : Form // GetScore 评分窗体
{
public GetScore()
{
InitializeComponent();
}
public Employee emplist; private void GetScore_Load(object sender, EventArgs e)
{ txtName.Text = emplist.Name;
txtAssess.Text = emplist.Assess;
txtScore.Text = emplist.Score.ToString();
} private void btnScore_Click(object sender, EventArgs e)
{ emplist.Assess = txtAssess.Text;
emplist.Score = Convert.ToInt32(txtScore.Text);
Commen.emp.BindList(); // emp 中有 集合emps的更新值
this.Close(); } }
}
====================
namespace Test2
{
public class Employee // Employee 类
{
public string ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Assess { get; set; }
public int Score { get; set; }
List<Employee> emps = new List<Employee> { }; public List <Employee > InitData()
{
Employee e1 = new Employee();
e1.ID ="001";
e1 .Name="张三";
e1 .Age =18 ;
emps.Add (e1);
Employee e2 = new Employee();
e2.ID = "002";
e2.Name = "王五";
e2.Age = 18;
emps.Add(e2); Employee e3 = new Employee();
e3.ID = "003";
e3.Name = "李四";
e3.Age = 18;
emps.Add(e3);
return emps; // 有上面赋的3个值
}
}
}======================
namespace Test2
{
class Commen // Commen 类
{
//public static Employee employist=null ;
public static Emp emp =null ;
public static Employee employ = null;
public Commen(Emp em)
{
emp = em;
}
}
}
解决方案 »
- 请教如何,过滤两特定字符a,b中间的字符串比如叫c
- C#引用未赋值和null在内存上是否有差别
- 如何读取EXCEL到DataTable,需要从指定的行列读取(C#)
- 怎样给 Response.Redirct("index.aspx")指定目标框架??在线等!解决不了要被开了!!!
- 模拟窗体的控件
- 用Response导出excel表。图片无法显示。怎么办?
- 如何在PPC上自动执行CAB安装文件
- 请问:在C#中如何判断某个程序本身已经在运行??
- 里调用什么api关闭其他的窗体?
- 俺想读取windows的日志不知道改怎么做请大虾帮忙
- WCF,服务地址能被反编译吗?
- 请教大家,该表格存数据库的话,数据库该如何设计
俺看过caozhy老师的这个帖子,后面会逐一地去实践,到时期待caozhy老师给予指点帮助。先从自己的理解能力,一步一步地实践吧,谢谢!!!
感谢 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上呢?
去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成 3 xN多次 个值不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。
去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成 3 xN多次 个值不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。谢谢 Afresh-Klo 老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误 也还有其他的问题,所以误判是因为没加break)。
但注释掉 break,却又出现了错误“索引超出范围”(附上图)。泛型集合 应该不能有索引错误把。
去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成 3 xN多次 个值不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。谢谢 Afresh-Klo 老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误 也还有其他的问题,所以误判是因为没加break)。
但注释掉 break,却又出现了错误“索引超出范围”(附上图)。泛型集合 应该不能有索引错误把。
你那句加了break的循环,其实就只循环了一次就退出了,所以你发现每次都只有一条数据,就是这个原因的。
越界的事,你要看emps是不是一个空的list
去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成 3 xN多次 个值不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。谢谢 Afresh-Klo 老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误 也还有其他的问题,所以误判是因为没加break)。
但注释掉 break,却又出现了错误“索引超出范围”(附上图)。泛型集合 应该不能有索引错误把。
你那句加了break的循环,其实就只循环了一次就退出了,所以你发现每次都只有一条数据,就是这个原因的。
越界的事,你要看emps是不是一个空的list这个问题,俺已经解决了 (#20楼)。
index = int.Parse(id)-1; -- 减一 就可以。十分感谢您的点拨!!!再拜求您帮忙指点一下 #23楼的问题,好吗,拜谢游牧小小诗人老师!
去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成 3 xN多次 个值不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。谢谢 Afresh-Klo 老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误 也还有其他的问题,所以误判是因为没加break)。
但注释掉 break,却又出现了错误“索引超出范围”(附上图)。泛型集合 应该不能有索引错误把。
你那句加了break的循环,其实就只循环了一次就退出了,所以你发现每次都只有一条数据,就是这个原因的。
越界的事,你要看emps是不是一个空的list好吧,我错了,越界是因为你的数组下标是0开始,而你的工号是从1开始的,读取工号3的时候,数组中是不存在的,就越界了。
如果整个列表数据很多很多的情况下,重新加载会很伤的。你可以想办法单独修改某行的子项的值。就像软件的界面设计一样,尽量不重画整个软件界面,
您是指 → emps = emp.InitData(); 吗?我也纠结在这里,不知应该如何修改? 应该如何修改呢? 非常感谢您的指导!!! public void BindList( )
{
emps = emp.InitData(); // 没走到 “=”时,集合emps中 有更新的Assess 和 Score的值值,但“=”后就没有了。
//清空ListView中的所有项
listView1.Items.Clear();
//如何将集合中的数据绑定到LIstVIew
//ListView中每一项都是ListViewItem
foreach ( Employee item in emps)
{
ListViewItem lv = new ListViewItem(); 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 );
}
}
您是指 → emps = emp.InitData(); 吗?我也纠结在这里,不知应该如何修改? 应该如何修改呢? 非常感谢您的指导!!! public void BindList( )
{
emps = emp.InitData(); // 没走到 “=”时,集合emps中 有更新的Assess 和 Score的值值,但“=”后就没有了。
//清空ListView中的所有项
listView1.Items.Clear();
//如何将集合中的数据绑定到LIstVIew
//ListView中每一项都是ListViewItem
foreach ( Employee item in emps)
{
ListViewItem lv = new ListViewItem(); 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参数,然后修改完再更新界面。 总之,我们的目的是把这个窗口声明的一个变量的地址传到另一个窗口,这样就可以在那边修改了,怎么传都可以。
==============
咱们一起 做一下,咋样? 握手
我的意思是(见#16楼),如果有新手,也想练练窗体传值,不妨一起做一下俺的这2个窗体,大家切磋互相帮助启发,不是挺好的事吗。happy09li老师(帖子 C# 窗体间传值方法大汇总)看到有新手 练习他的帖子方法,也会很高兴吧。对您的关注和指导,俺再次表示由衷的感谢!!!
感谢 Afresh-Klo 老师回复!!!
去掉这行代码,出现如下错误:
Employee emp = new Employee();
List<Employee> emps=null;
public Emp()
{
InitializeComponent();
Commen co = new Commen(this);
}
private void Emp_Load(object sender, EventArgs e)
{
emps = emp.InitData();
BindList();
}
万分感谢 Afresh-Klo 老师!!!
经 您的修改,主窗体Emp 成功 更新了。
但我还没明白为什么,我要好好想想一下,纠结的地方 还要麻烦您点拨啊!!!
private List<Employee> emps = null; //将全局变量的声明都置于函数顶端方便管理。
public Emp()
{
InitializeComponent();
Commen co = new Commen(this);
}
private void Emp_Load(object sender, EventArgs e)
{
emps = emp.InitData(); //这句将初始化赋值给emps,这样才是真正的初始化,因为你后面用的都是emps而不是emp,所以只是执行emp.InitData()没什么意义。
BindList();
}
public void BindList()
{
//emps = emp.InitData(); //这句将emps重新赋值了,所以你窗体传过来的数据被刷新了,因为你InitData里面的赋值是常量,固定的,所以每次执行BindList都会重新赋值成初始值。
listView1.Items.Clear();
foreach (Employee item in emps)
{
ListViewItem lv = new ListViewItem();
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 );
}
}看看这个 C#编程规范(我刚刚发表的,还在修改) 希望对你有所帮助。
感谢 Afresh-Klo 老师!!!我要好好理解一下。
俺已经收藏了您的C#编程规范,钦佩您的无私奉献精神!!!
先看emp.InitData()这个方法里面就是赋初值,23#的问题不是没有赋值成功,而是你赋值还是传的原来的值,这是由你InitData()这个方法决定的,你快看看这里面的emps是不是固定的值呀?但是把emps=emp.InitData()去掉后,emps就没有值了,因为你声明的时候是null。所以把emps=emp.InitData()放到初始化中,这样既赋了初值,也不影响BindList的功能。之所以你会有这么多错误及不规范,且自己还不明白怎么回事,是因为基础不好,先去学习C#基础语法。第二个问题,因为emps声明的是全局变量,就是整个类里面都可以调用的变量,所以第一次赋值以后,在类中任何地方调用都会有值,赋值的语句还是emps=emp.InitData(),在你修改前后都有这句,所以他一直是有值的。如果不了解程序运行过程,在初始化后面F9加断点,F10一步步调试查看即可。基础太差,先去学基础,不然总是会有这种小问题。
Afresh-Klo 老师,求教您:
万分感激 Afresh-Klo老师 的点拨指导,我恍然大悟,豁然开朗了。我明白了,分析代码 执行顺序非常重要。这三个东东 执行顺序是:Emp-Load → BindList() → listView1_DoubleClick。 当执行BindList()时, private List<Employee> emps 的值是 空,还没有值,所以此时 运行 BindList(),程序就出错 (没NEW),所以必须 在 BindList()里面 实例化 emps = emp.InitData(); 而上面之后,运行listView1_DoubleClick时,private List<Employee> emps 已经有值,所以在listView1_DoubleClick里面的 Emps 就没有出错。今天俺又进步啦
万分感激 Afresh-Klo老师 的点拨指导,我恍然大悟,豁然开朗了。我明白了,分析代码 执行顺序非常重要。这三个东东 执行顺序是:Emp-Load → BindList() → listView1_DoubleClick。 当执行BindList()时, private List<Employee> emps 的值是 空,还没有值,所以此时 运行 BindList(),程序就出错 (没NEW),所以必须 在 BindList()里面 实例化 emps = emp.InitData(); 而上面之后,运行listView1_DoubleClick时,private List<Employee> emps 已经有值,所以在listView1_DoubleClick里面的 Emps 就没有出错。今天俺又进步啦 嗯,有一点需要注意,这里你实例化emps = emp.InitData();应该放在初始化中,如果放在BindList()里面可能还会影响传值。
万分感激 Afresh-Klo老师 的点拨指导,我恍然大悟,豁然开朗了。我明白了,分析代码 执行顺序非常重要。这三个东东 执行顺序是:Emp-Load → BindList() → listView1_DoubleClick。 当执行BindList()时, private List<Employee> emps 的值是 空,还没有值,所以此时 运行 BindList(),程序就出错 (没NEW),所以必须 在 BindList()里面 实例化 emps = emp.InitData(); 而上面之后,运行listView1_DoubleClick时,private List<Employee> emps 已经有值,所以在listView1_DoubleClick里面的 Emps 就没有出错。今天俺又进步啦 嗯,有一点需要注意,这里你实例化emps = emp.InitData();应该放在初始化中,如果放在BindList()里面可能还会影响传值。谢谢 Afresh-Klo 老师 诲人不倦的崇高精神!!!