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;          
         }   
    }
}

解决方案 »

  1.   


    俺看过caozhy老师的这个帖子,后面会逐一地去实践,到时期待caozhy老师给予指点帮助。先从自己的理解能力,一步一步地实践吧,谢谢!!!
      

  2.   


    感谢 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.   

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

  4.   


    去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成 3 xN多次 个值不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。
      

  5.   


    去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成 3 xN多次 个值不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。谢谢 Afresh-Klo 老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误 也还有其他的问题,所以误判是因为没加break)。
    但注释掉 break,却又出现了错误“索引超出范围”(附上图)。泛型集合 应该不能有索引错误把。
      

  6.   

    现在的问题是 #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上呢?
      

  7.   


    去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成 3 xN多次 个值不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。谢谢 Afresh-Klo 老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误 也还有其他的问题,所以误判是因为没加break)。
    但注释掉 break,却又出现了错误“索引超出范围”(附上图)。泛型集合 应该不能有索引错误把。
    你那句加了break的循环,其实就只循环了一次就退出了,所以你发现每次都只有一条数据,就是这个原因的。
    越界的事,你要看emps是不是一个空的list
      

  8.   


    去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成 3 xN多次 个值不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。谢谢 Afresh-Klo 老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误 也还有其他的问题,所以误判是因为没加break)。
    但注释掉 break,却又出现了错误“索引超出范围”(附上图)。泛型集合 应该不能有索引错误把。
    你那句加了break的循环,其实就只循环了一次就退出了,所以你发现每次都只有一条数据,就是这个原因的。
    越界的事,你要看emps是不是一个空的list这个问题,俺已经解决了 (#20楼)。
    index = int.Parse(id)-1; -- 减一 就可以。十分感谢您的点拨!!!再拜求您帮忙指点一下 #23楼的问题,好吗,拜谢游牧小小诗人老师!
      

  9.   


    去掉后,会不停地添加,也就是说,原本只放了3个数据,但会变成 3 xN多次 个值不停的循环,并不是foreach错,也不应该加break停止循环,而是emps的数据有问题,加断点调试一下,跟踪emps。看看他到底都是什么值。谢谢 Afresh-Klo 老师指导!!!按照您的指引,我跟踪了,结果没出现以前的错误(也许之前的错误 也还有其他的问题,所以误判是因为没加break)。
    但注释掉 break,却又出现了错误“索引超出范围”(附上图)。泛型集合 应该不能有索引错误把。
    你那句加了break的循环,其实就只循环了一次就退出了,所以你发现每次都只有一条数据,就是这个原因的。
    越界的事,你要看emps是不是一个空的list好吧,我错了,越界是因为你的数组下标是0开始,而你的工号是从1开始的,读取工号3的时候,数组中是不存在的,就越界了。
      

  10.   

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

  11.   


    您是指 → 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 );
                   
                }
                         }
      

  12.   


    您是指 → 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参数,然后修改完再更新界面。 总之,我们的目的是把这个窗口声明的一个变量的地址传到另一个窗口,这样就可以在那边修改了,怎么传都可以。
      

  13.   

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

  14.   


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

  15.   

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

  16.   


    感谢 Afresh-Klo 老师回复!!!
    去掉这行代码,出现如下错误:
      

  17.   

    关于上面 #36 楼 问题,比较 本类中的 listView1_DoubleClick(object sender, EventArgs e):
      

  18.   

    没赋值啊,当然不行,你后面的已经复制了呀=。=
            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();
            }
      

  19.   


    万分感谢 Afresh-Klo 老师!!! 
    经 您的修改,主窗体Emp 成功 更新了。
    但我还没明白为什么,我要好好想想一下,纠结的地方 还要麻烦您点拨啊!!!
      

  20.   

            private Employee emp = new Employee(); //别的类用不到的变量及函数设为私有。
            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#编程规范(我刚刚发表的,还在修改) 希望对你有所帮助。
      

  21.   


    感谢 Afresh-Klo 老师!!!我要好好理解一下。
    俺已经收藏了您的C#编程规范,钦佩您的无私奉献精神!!!
      

  22.   

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

  23.   

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

  24.   

    感谢 Afresh-Klo老师 #44楼的回复。俺要仔细读读,理解。俺基础差,必须加大基础练习,弄懂为什么错。还需要老师帮助指导点拨,拜谢!!!
      

  25.   


    Afresh-Klo 老师,求教您:
      

  26.   

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

  27.   


    万分感激 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 就没有出错。今天俺又进步啦 
      

  28.   


    万分感激 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()里面可能还会影响传值。
      

  29.   


    万分感激 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 老师 诲人不倦的崇高精神!!!