注册 登录
编程论坛 C# 论坛

求教:窗体的 静态 类变量的 作用

learnerok 发布于 2014-02-02 11:03, 4071 次点击
只有本站会员才能查看附件,请 登录


发上代码附件

我的问题是:

为什么 Emp窗体 必须声明一个 该窗体类的一个 公共静态 变量,必须通过该窗体类变量在 GetScore窗体上 调用 Emp窗体 的BindList()方法,即: Emp.parent.BindList(),而不能 Emp emp = new Emp(); → emp.BindList(); 为什么? 这种做法或用法称作什么?

在下学生拜谢老师大侠先!!!

==========================

namespace EmpList
{
    public partial class Emp : Form
    {
       public static Emp parent = null; //声明静态成员,以便在另一个窗体上调用该窗体的子窗体(listView)上的方法
                                         //否则 Emp.cs 的 62行 →  lv.Text = emps[i].ID; 会出现 “未将对象引用设置到对象实例”
            
        public Emp()
        {
            InitializeComponent();
            parent = this;
           // BindList();
        
           
        }
      
        //可以长度为3的数组存储3个员工的信息
        Employee[] emps = new Employee[3];
        
        public void InitData()
        {
            emps[0] = new Employee();
            emps[0].ID = "001";
            emps[0].Name = "张三";
            emps[0].Age = 18;

            emps[1] = new Employee();
            emps[1].ID = "002";
            emps[1].Name = "李四";
            emps[1].Age = 18;

            emps[2] = new Employee();
            emps[2].ID = "003";
            emps[2].Name = "王五";
            emps[2].Age = 18;

        }
        private void Emp_Load(object sender, EventArgs e)
        {
            //01.先构造出数据存储到数组中
            InitData();
            //02.将构造的员工添加到LIstView中
            BindList();
        }
      
        
        public void BindList()
        {
            //清空ListView中的所有项
            listView1.Items.Clear();
            //如何将数组中的数据绑定到LIstVIew
            //ListView中每一项都是ListViewItem
            for (int i = 0; i <emps.Length; i++)
            {
                ListViewItem lv = new ListViewItem();

                lv.Text = emps[i].ID;
            
                 //SubItems是每一项的对应的列
                // lv.SubItems.Add(emps[i].ID);
                 lv.SubItems.Add(emps[i].Name);
                 lv.SubItems.Add(emps[i].Age.ToString());
                 lv.SubItems.Add(emps[i].Assess);
                 lv.SubItems.Add(emps[i].Score.ToString());

                 listView1.Items.Add(lv);
            }
        }
      
        
        //对象数组实现窗体间数据的传递
        private void listView1_DoubleClick(object sender, EventArgs e)
        {
            //如何将Emp窗体中的员工数组中的员工信息读取到GetScore窗体中?
            //找到当前用户选中的员工
           string id= listView1.SelectedItems[0].Text;
            //必须循环遍历整个数据,将数组中的每个员工的编号与选中的员工编号
            //比较,如果一致,则将该员工的信息传递到GetScore中
           
            int index = 0;//定义一个变量保存选中员工在数组中的位置
           for (int i = 0; i < emps.Length; i++)
           {
               if(emps[i].ID==id)
               {
                   index = i;
                   break;
                   //return 不能用return
               }
           }
            //获取到了选中的对象
           Employee emp = emps[index];
            GetScore frm = new GetScore();
            frm.emplist = emp;
            frm.Show();
        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }


      
    }
}


=========================
namespace EmpList
{
    public partial class GetScore : Form
    {
        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);

            //调用Emp窗体的BindList()方法重新绑定
            //Emp emp = new Emp();
            //emp.BindList();

           
            
            Emp.parent.BindList();//这里必须用Emp窗体上的静态成员parent来调用Emp窗体上的BindList()方法,
            this.Close();         //否则 Emp.cs 的 62行 →  lv.Text = emps[i].ID; 会出现 “未将对象引入实例”错误

         
        }
    }
}
52 回复
#2
TonyDeng2014-02-02 11:40
在甲對象調用乙對象的邏輯原因是什麽?
#3
learnerok2014-02-02 11:51
以下是引用TonyDeng在2014-2-2 11:40:11的发言:

在甲對象調用乙對象的邏輯原因是什麽?

=====================

感谢 TonyDeng 老师的回复,曾多次受教您的指导!!!

我没有明白“在甲對象調用乙對象的邏輯原因是什麽?”这句话的含义,第一次读到这样的概念,很想听听您的讲解。遗漏这样的重要概念,代码肯定学不好。

万分感谢您的帮教!!!
#4
TonyDeng2014-02-02 11:58
你不是要在GetScore類的窗體(甲)上調用Emp類的窗體(乙)的方法嗎?這樣做的理由是什麽呢?你想象一下,這是甲乙兩個不同的部門,你在甲部門工作,希望乙部門做什麽事,爲什麽不是讓它自己處理(由乙部門自己調用方法)而是你甲部門直接調用乙部門的方法?這合管理原則嗎?這其實不是能不能做到的問題,而是是否應該這樣做的問題,之所以要設計爲這樣調用,就是這個原因。

[ 本帖最后由 TonyDeng 于 2014-2-2 11:59 编辑 ]
#5
learnerok2014-02-02 12:00
里氏替换原则:父类对象 指向 子类实例  Father f = new Son (); 这是 继承逻辑关系,所以可以。

但1楼的问题,好像不是这个吧?
#6
learnerok2014-02-02 12:03
以下是引用TonyDeng在2014-2-2 11:58:35的发言:

你不是要在GetScore類的窗體(甲)上調用Emp類的窗體(乙)的方法嗎?這樣做的理由是什麽呢?你想象一下,這是甲乙兩個不同的部門,你在甲部門工作,希望乙部門做什麽事,爲什麽不是讓它自己處理(由乙部門自己調用方法)而是你甲部門直接調用乙部門的方法?這合管理原則嗎?這其實不是能不能做到的問題,而是是否應該這樣做的問題,之所以要設計爲這樣調用,就是這個原因。

===================

没太明白,让我的榆木脑袋想想。万分感谢您!!!
#7
TonyDeng2014-02-02 12:07
你Emp類和GetScore類是兩個不同的類,去調用父類的方法幹什麽?你的對象從類生成,不是從父類生成,調用父類的非靜態方法,當然要有父類的對象實例才行了!你這個設計,是相當彆扭的,直接在類上公開一個方法,讓別的對象調用就可以了,不需要用靜態,BindList()本身在邏輯上就不該是類行爲。
#8
learnerok2014-02-02 12:18
以下是引用TonyDeng在2014-2-2 12:07:06的发言:

你Emp類和GetScore類是兩個不同的類,去調用父類的方法幹什麽?你的對象從類生成,不是從父類生成,調用父類的非靜態方法,當然要有父類的對象實例才行了!你這個設計,是相當彆扭的,直接在類上公開一個方法,讓別的對象調用就可以了,不需要用靜態,BindList()本身在邏輯上就不該是類行爲。

==================

这个代码 是 一次听课上的 代码,琢磨了很长时间不明白为什么。现提交这个我受益颇多热爱的编程网上求教老师。

求您指导:
1.这个 静态类变量 为什么可以,而实例化窗体对象则不能调用?
2.好的合理代码,应该如何写呢?(“直接在類上公開一個方法”  与  “BindList()本身在邏輯上就不該是類行爲”---- 不太理解??)
#9
learnerok2014-02-02 12:33
“你Emp類和GetScore類是兩個不同的類,去調用父類的方法幹什麽?”

BindList() 是 Emp類 的方法吧,也就是说,GetScore類 调用 Emp類的 BindList()方法。您说的“父類的方法”是指“Emp類的 BindList()方法”吗?

 Emp類 和 GetScore類 不是 父类 和 子类 的关系吧?

感谢 TonyDeng 老师指点!!!

[ 本帖最后由 learnerok 于 2014-2-2 12:35 编辑 ]
#10
TonyDeng2014-02-02 12:34
程序代码:

using System;
using System.Collections.Generic;
using using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace EmpList
{
    public partial class GetScore : Form
    {
        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);

            //调用Emp窗体的BindList()方法重新绑定
            Emp emp = new Emp();
            emp.BindList();

         
           
            //Emp.parent.BindList();//这里必须用Emp窗体上的静态成员parent来调用Emp窗体上的BindList()方法,
            this.Close();         //否则 Emp.cs 的 62行 →  lv.Text = emps[i].ID; 会出现 “未将对象引入实例”错误

         
        }
    }
}


#11
TonyDeng2014-02-02 12:35
程序代码:

using System;
using System.Collections.Generic;
using using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace EmpList
{
    public partial class Emp : Form
    {
       //public static Emp parent = null; //声明静态成员,以便在另一个窗体上调用该窗体的子窗体(listView)上的方法
                                         
//否则 Emp.cs 的 62行 →  lv.Text = emps[i].ID; 会出现 “未将对象
            
        public Emp()
        {
            InitializeComponent();
            //parent = this;
           
// BindList();
      
         
        }
      
        //可以长度为3的数组存储3个员工的信息
        Employee[] emps = new Employee[3];
      
        public void InitData()
        {
            emps[0] = new Employee();
            emps[0].ID = "001";
            emps[0].Name = "张三";
            emps[0].Age = 18;

            emps[1] = new Employee();
            emps[1].ID = "002";
            emps[1].Name = "李四";
            emps[1].Age = 18;

            emps[2] = new Employee();
            emps[2].ID = "003";
            emps[2].Name = "王五";
            emps[2].Age = 18;

        }
        private void Emp_Load(object sender, EventArgs e)
        {
            //01.先构造出数据存储到数组中
            InitData();
            //02.将构造的员工添加到LIstView中
            BindList();
        }
      
      
        public void BindList()
        {
            //清空ListView中的所有项
            listView1.Items.Clear();
            //如何将数组中的数据绑定到LIstVIew
            
//ListView中每一项都是ListViewItem
            for (int i = 0; i <emps.Length; i++)
            {
                ListViewItem lv = new ListViewItem();

                lv.Text = emps[i].ID;
            
                 //SubItems是每一项的对应的列
               
// lv.SubItems.Add(emps[i].ID);
                 lv.SubItems.Add(emps[i].Name);
                 lv.SubItems.Add(emps[i].Age.ToString());
                 lv.SubItems.Add(emps[i].Assess);
                 lv.SubItems.Add(emps[i].Score.ToString());

                 listView1.Items.Add(lv);
            }
        }
      
      
        //对象数组实现窗体间数据的传递
        private void listView1_DoubleClick(object sender, EventArgs e)
        {
            //如何将Emp窗体中的员工数组中的员工信息读取到GetScore窗体中?
            
//找到当前用户选中的员工
           string id= listView1.SelectedItems[0].Text;
            //必须循环遍历整个数据,将数组中的每个员工的编号与选中的员工编号
            
//比较,如果一致,则将该员工的信息传递到GetScore中
         
            int index = 0;//定义一个变量保存选中员工在数组中的位置
           for (int i = 0; i < emps.Length; i++)
           {
               if(emps[i].ID==id)
               {
                   index = i;
                   break;
                   //return 不能用return
               }
           }
            //获取到了选中的对象
           Employee emp = emps[index];
            GetScore frm = new GetScore();
            frm.emplist = emp;
            frm.Show();
        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }


      
    }
}

#12
TonyDeng2014-02-02 12:36
以後不要起parent這種名字
#13
learnerok2014-02-02 12:41
Emp emp = new Emp();
emp.BindList();
==================

这样 就会出现 “未将对象引用设置到对象实例”,我试过了。

我曾这样试过多次,也试过 把 public static Emp parent = null 改为 非静态的,也试过 在 BindList() 中实例化 Employee[] emps = new Employee[3]; 都失败了。

总之,改变一处,出现问题 就 修改,但另一个问题又出现。只能用1楼的代码才可以,郁闷。

[ 本帖最后由 learnerok 于 2014-2-2 12:43 编辑 ]
#14
TonyDeng2014-02-02 12:42
我改了兩個模塊、兩個地方,你自己仔細比較一下。
#15
learnerok2014-02-02 12:44
以下是引用TonyDeng在2014-2-2 12:42:35的发言:

我改了兩個模塊、兩個地方,你自己仔細比較一下。

============
好的,我还没找到,我仔细查看一下,太感谢您的耐心辅导!!!
#16
learnerok2014-02-02 12:50
TonyDeng老师 改的 2处:

第一处是:
// public static Emp parent = null;


 Emp()
{
InitializeComponent();
//parent = this;
// BindList();
}


第二处是:
private void btnScore_Click(object sender, EventArgs e)
{
emplist.Assess = txtAssess.Text;
emplist..Score = Convert.ToInt32(txtScore.Text);

//调用Emp窗体的BindList()方法重新绑定
Emp emp = new Emp();
  emp.BindList();

}
[/color]
 

//Emp.parent.BindList();//这里必须用Emp窗体上的静态成员parent来调用Emp窗体上的BindList()方法,
琀栀椀猀.Close();//否则 Emp.cs 的 62行 →氀瘀.Text = emps[i].ID; 会出现 “未将对象引入实例”错误



======================

我试过了,这样就会出现“未将对象引用设置到对象实例”错误。

[ 本帖最后由 learnerok 于 2014-2-2 12:55 编辑 ]
#17
TonyDeng2014-02-02 12:52
我運行沒有問題,那是你的事。要麽把代碼黏貼回去。
#18
learnerok2014-02-02 12:56
以下是引用TonyDeng在2014-2-2 12:52:37的发言:

我運行沒有問題,那是你的事。要麽把代碼黏貼回去。

============

好的,我试试。感谢您!!!
#19
learnerok2014-02-02 13:24
以下是引用TonyDeng在2014-2-2 12:52:37的发言:

我運行沒有問題,那是你的事。要麽把代碼黏貼回去。

===================

TonyDeng老师,我把我之前的代码全部注释掉,两个窗体完全复制您的代码,但是 Emp窗体类 出现如下错误


public void BindList()
        {
            //清空ListView中的所有项
            listView1.Items.Clear();
            //如何将数组中的数据绑定到LIstVIew
            //ListView中每一项都是ListViewItem
            for (int i = 0; i < emps.Length; i++)
            {
                ListViewItem lv = new ListViewItem();

                lv.Text = emps[i].ID; // 错误“未将对象引用设置到对象实例”

                //SubItems是每一项的对应的列
                // lv.SubItems.Add(emps[i].ID);
                lv.SubItems.Add(emps[i].Name);
                lv.SubItems.Add(emps[i].Age.ToString());
                lv.SubItems.Add(emps[i].Assess);
                lv.SubItems.Add(emps[i].Score.ToString());

                listView1.Items.Add(lv);
            }
        }
#20
learnerok2014-02-02 18:55
期待老师指点帮助,感谢ing!!!
#21
TonyDeng2014-02-03 02:11
你做什麽動作時出現這個錯誤?
#22
learnerok2014-02-03 17:26
以下是引用TonyDeng在2014-2-3 02:11:59的发言:

你做什麽動作時出現這個錯誤?
粘贴您的代码后,重新生成,之后运行的时侯出现的问题。
多谢您的回复!!!

[ 本帖最后由 learnerok 于 2014-2-3 17:27 编辑 ]
#23
learnerok2014-02-03 18:06
1楼的 用 静态 类变量 ” 来调用 方法 的做法 称作什么呢??

感谢 老师指点!!!
#24
TonyDeng2014-02-03 19:14
我沒運行出你所說的現象
#25
learnerok2014-02-03 21:35
以下是引用TonyDeng在2014-2-3 19:14:24的发言:

我沒運行出你所說的現象
我使用的是VS2010,您用的也是吗?
#26
TonyDeng2014-02-03 22:30
我用12,與版本沒多大關係的。你的程序就是一個表格,點擊一行出現再出現一個窗體麽,運行沒問題啊。
#27
learnerok2014-02-04 10:31
以下是引用TonyDeng在2014-2-3 22:30:46的发言:

我用12,與版本沒多大關係的。你的程序就是一個表格,點擊一行出現再出現一個窗體麽,運行沒問題啊。

是在 “填充第二个窗体表格后,点击“确定””后 出现问题的

TonyDeng老师,您能帮忙解释一下 ““ 静态 类变量 ” 来调用 方法 的做法 称作什么呢??” 吗??

对于1楼的问题,我纠结了好久,也在网上搜寻该问题,但都未能找到,好郁闷啊。


[ 本帖最后由 learnerok 于 2014-2-4 12:13 编辑 ]
#28
learnerok2014-02-04 11:57
以下是引用TonyDeng在2014-2-3 22:30:46的发言:

我用12,與版本沒多大關係的。你的程序就是一個表格,點擊一行出現再出現一個窗體麽,運行沒問題啊。
运行过程是这样的:运行 → 出现listView 的 Emp 窗体 → 双击一行 → 出现“评分”窗体GetScore → 填充评分 → 确定后 → Emp 窗体有了更新

是在 “填充第二个窗体表格后,点击“确定””后 出现问题的。


[ 本帖最后由 learnerok 于 2014-2-4 12:13 编辑 ]
#29
TonyDeng2014-02-04 20:44
粗略看,是邏輯錯誤,點擊【評分】後,你重新生成一個Emp對象,這個對象沒有執行InitData(),裏面是空的。
#30
TonyDeng2014-02-04 20:47
至於你百思不解的問題,那沒什麽專有名稱,其方法原理不過是使用了一個屬於類的共享字段(類的聲明爲靜態的對象本質上是全局變量的性質,類中的全局)進行數據交換和調用。
#31
learnerok2014-02-04 22:08
以下是引用TonyDeng在2014-2-4 20:44:10的发言:

粗略看,是邏輯錯誤,點擊【評分】後,你重新生成一個Emp對象,這個對象沒有執行InitData(),裏面是空的。
是 BindList() 里的  lv.Text = emps[i].ID; // 错误“未将对象引用设置到对象实例”

非常感谢您的指导回复!!!

======================

public void BindList()
        {
            //清空ListView中的所有项
            listView1.Items.Clear();
            //如何将数组中的数据绑定到LIstVIew
            //ListView中每一项都是ListViewItem
            for (int i = 0; i < emps.Length; i++)
            {
                ListViewItem lv = new ListViewItem();

                lv.Text = emps[i].ID; // 错误“未将对象引用设置到对象实例”

                //SubItems是每一项的对应的列
                // lv.SubItems.Add(emps[i].ID);
                lv.SubItems.Add(emps[i].Name);
                lv.SubItems.Add(emps[i].Age.ToString());
                lv.SubItems.Add(emps[i].Assess);
                lv.SubItems.Add(emps[i].Score.ToString());

                listView1.Items.Add(lv);
            }
        }
#32
learnerok2014-02-04 22:23
以下是引用TonyDeng在2014-2-4 20:47:32的发言:

至於你百思不解的問題,那沒什麽專有名稱,其方法原理不過是使用了一個屬於類的共享字段(類的聲明爲靜態的對象本質上是全局變量的性質,類中的全局)進行數據交換和調用。
1.是否可以这样理解,全局静态字段 的 功用 就是 方便 数据 调用的?

2.1楼的问题,只能通过 这个 静态的 “类变量” 来调用 绑定方法(BindList()
)??

多谢您的指导!!!
#33
TonyDeng2014-02-04 22:30
都不知道應該怎麽教你,前面説過的又要返回頭說:這種方法——至少在你目前的應用上——是彆扭的、不合邏輯的旁門辦法。
後一個問題爲什麽錯,已經告訴你什麽原因了。
#34
learnerok2014-02-04 22:52
以下是引用TonyDeng在2014-2-4 22:30:25的发言:

都不知道應該怎麽教你,前面説過的又要返回頭說:這種方法——至少在你目前的應用上——是彆扭的、不合邏輯的旁門辦法。
後一個問題爲什麽錯,已經告訴你什麽原因了。
还是没明白啊,汗!

再请教:
1. “是彆扭的、不合邏輯的旁門辦法”----- 如何做才是符合逻辑的 好的代码?
2. 您指的是“逻辑问题”吗? 俺还是不明白 是怎么个逻辑问,您能在进一步讲解一下吗?
  或者说,为什么会出现“你重新生成一個Emp對象,這個對象沒有執行InitData(),裏面是空的” 问题??

多谢您!!!

[ 本帖最后由 learnerok 于 2014-2-5 08:49 编辑 ]
#35
learnerok2014-02-05 12:32
等问题搞明白了,再结贴,可以吗?
多谢版主!!!
#36
TonyDeng2014-02-05 14:02
你自己看看這個點擊動作做的是什麽?看注釋了4個星號的代碼。

程序代码:

        //点击评分

        private void btnScore_Click(object sender, EventArgs e)
        {
            emplist.Assess = txtAssess.Text;
            emplist.Score = Convert.ToInt32(txtScore.Text);

            //调用Emp窗体的BindList()方法重新绑定
            Emp emp = new Emp();        // ****
            emp.BindList();             // ****

         
           
            
//Emp.parent.BindList();//这里必须用Emp窗体上的静态成员parent来调用Emp窗体上的BindList()方法,
            Close();         //否则 Emp.cs 的 62行 →  lv.Text = emps[i].ID; 会出现 “未将对象引入实例”错误

         
        }

你這裏new Emp出來的已經不是原來那個窗體,是一個新的對象,原來的窗體殘留在内存中被廢棄了,但你又想把此處的結果顯示到新的窗體上,於是把原有窗體的數據通過類靜態數據傳到新的窗體中,你舉得這種做法符合邏輯嗎?

以下是你原窗體的加載過程:
程序代码:

        private void Emp_Load(object sender, EventArgs e)
        {
            //01.先构造出数据存储到数组中
            InitData();
            //02.将构造的员工添加到LIstView中
            BindList();
        }

比較一下兩個窗體的創建,缺了什麽,把缺了的部分補回去看看。

其實,就算你這個程序改到沒錯,也是畸形的實現辦法,數據沒有與界面分離,居然還把數據嵌入到類中。正確的做法是做一個數據類,由界面代碼調用數據,不同的窗體操作同一個數據對象。要弄好它,程序的整個架構要重寫,沒法在原有基礎上改好的。

[ 本帖最后由 TonyDeng 于 2014-2-5 14:16 编辑 ]
#37
TonyDeng2014-02-05 14:21
另外,最好不要動不動就彈窗,用戶感受不好的,也增加編程的麻煩,事實上你現在遇到的問題就是彈窗造成的,如果界面在同一個窗體上,就不會遇到這種問題。
#38
learnerok2014-02-05 16:09
很感谢TonyDeng老师的 指导,获得了不少新概念,比如数据要与界面分离,虽然学了点三层架构,但概念还是比较生疏的。

我提交的问题,是授课老师讲解静态变量时的举例,因基础差,当时没理解,一直在郁闷中求得理解。

您能 帮助 指导 理解一下 为什么会出现“你重新生成一個Emp對象,這個對象沒有執行InitData(),裏面是空的” 问题??

谢谢您!!!
#39
TonyDeng2014-02-05 16:30
你在點擊【評分】的方法中設置斷點,逐行跟踪程序的流程看看都幹了些什麽不就知道了麽。
#40
learnerok2014-02-05 16:46
以下是引用TonyDeng在2014-2-5 16:30:23的发言:

你在點擊【評分】的方法中設置斷點,逐行跟踪程序的流程看看都幹了些什麽不就知道了麽。
俺只是看到了如下问题 → :但不懂 为什么会出现下面的问题,都 new 了呀,
为啥还出现 “未将对象引用设置到对象实例”??


public void BindList()
        {
            //清空ListView中的所有项
            listView1.Items.Clear();
            //如何将数组中的数据绑定到LIstVIew
            //ListView中每一项都是ListViewItem
            for (int i = 0; i < emps.Length; i++)
            {
                ListViewItem lv = new ListViewItem();

                lv.Text = emps[i].ID; // 错误“未将对象引用设置到对象实例”

                //SubItems是每一项的对应的列
                // lv.SubItems.Add(emps[i].ID);
                lv.SubItems.Add(emps[i].Name);
                lv.SubItems.Add(emps[i].Age.ToString());
                lv.SubItems.Add(emps[i].Assess);
                lv.SubItems.Add(emps[i].Score.ToString());

                listView1.Items.Add(lv);
            }
        }
#41
TonyDeng2014-02-05 16:58
正因爲是new,你這個時候new出來的Emp類窗體已經不是原來那個,是全新的,這個新new出來的窗體沒有執行InitData()方法,當然不會有數據。
#42
learnerok2014-02-05 17:05
以下是引用TonyDeng在2014-2-5 16:58:48的发言:

正因爲是new,你這個時候new出來的Emp類窗體已經不是原來那個,是全新的,這個新new出來的窗體沒有執行InitData()方法,當然不會有數據。

为什么 “這個新new出來的窗體沒有執行InitData()方法”呢? 什么原因呢?

谢谢TonyDeng老师回复!!!
#43
TonyDeng2014-02-05 17:18
都叫你跟踪程序執行流程了,光說是沒有感覺的。
#44
learnerok2014-02-05 18:06
以下是引用TonyDeng在2014-2-5 17:18:29的发言:

都叫你跟踪程序執行流程了,光說是沒有感覺的。
我跟踪了,确实如您所说。
为此,我把 InitData() 放到 BindList() 里面(附上代码), 虽然没有再出现 上面的错误(lv.Text = emps[i].ID; // 错误“未将对象引用设置到对象实例”),但“确认”后,Emp 窗体 却没有更新变化,也没有任何错误提示,无声无息了...。 到底是咋回事呀 ,郁闷死啦

万分感谢 TonyDeng 老师 这些天的帮助,还要请您点拨点拨啊!!!


===========================
 public void BindList()
        {
            InitData();
            
            //清空ListView中的所有项
            listView1.Items.Clear();
            //如何将数组中的数据绑定到LIstVIew
            //ListView中每一项都是ListViewItem
            
            for (int i = 0; i < emps.Length; i++)
            {
                ListViewItem lv = new ListViewItem();

                lv.Text = emps[i].ID;

                //SubItems是每一项的对应的列
                // lv.SubItems.Add(emps[i].ID);
                lv.SubItems.Add(emps[i].Name);
                lv.SubItems.Add(emps[i].Age.ToString());
                lv.SubItems.Add(emps[i].Assess);
                lv.SubItems.Add(emps[i].Score.ToString());

                listView1.Items.Add(lv);
            }
        }




也试了 将  InitData() 放到 Emp 窗体的 构造函数 里面(附上代码), 也不行,情况 如同 放到 BindList() 里面 一样:

   public Emp()
        {
            InitializeComponent();
            InitData();
            //parent = this;
           
        }

[ 本帖最后由 learnerok 于 2014-2-5 18:56 编辑 ]
#45
learnerok2014-02-05 18:38
TonyDeng 老师,要不然,您现在 为俺 揭秘吧,行吗? 多谢啦 !!!
#46
TonyDeng2014-02-07 13:12
你一開始的窗體行,仔細看看自己的代碼,InitData()在該窗體對象Load的時候被執行,而不是在該對象new的時候被執行。而後來不行,是因爲new了一個對象之後既沒有執行Load,也沒有主動執行InitData()。你似乎沒有搞清楚類和對象的區別。

你在New Emp一個新對象之後,主動執行IniaData()方法即可看到效果。然而這種用新對象覆蓋舊對象的方法,是畸形的,怎麽改都畸形。

[ 本帖最后由 TonyDeng 于 2014-2-7 13:14 编辑 ]
#47
learnerok2014-02-07 18:33
以下是引用TonyDeng在2014-2-7 13:12:16的发言:

你一開始的窗體行,仔細看看自己的代碼,InitData()在該窗體對象Load的時候被執行,而不是在該對象new的時候被執行。而後來不行,是因爲new了一個對象之後既沒有執行Load,也沒有主動執行InitData()。你似乎沒有搞清楚類和對象的區別。

你在New Emp一個新對象之後,主動執行IniaData()方法即可看到效果。然而這種用新對象覆蓋舊對象的方法,是畸形的,怎麽改都畸形。


感谢 TonyDeng老师 指点!!!

我在试图 使用 一个全局类 来 储存 Emp 窗体的值,然后 在 GetScore 窗体 通过 这个全局类来调用 BindList()。
请教您:这样可以吗?

但是,如何 定义 这个全局类,并 存储 Emp 窗体的值 呢? 我正在 网上搜素,思考中 ing ...
#48
TonyDeng2014-02-07 19:45
只有本站会员才能查看附件,请 登录

直接在單元格Cell上修改數據,不用另彈窗口。


[ 本帖最后由 TonyDeng 于 2014-2-7 19:50 编辑 ]
#49
learnerok2014-02-07 21:02
以下是引用TonyDeng在2014-2-7 19:45:48的发言:


直接在單元格Cell上修改數據,不用另彈窗口。


谢谢 TonyDeng 老师!!!

偶还是想练练窗体间的传值。Wpf不熟悉,对于俺这样的菜鸟,还是先把winform搞懂吧,
#50
有容就大2014-02-07 22:35
这小MM真爱学习啊 PFPF
#51
learnerok2014-02-07 22:42
谢谢 有容就大 夸奖
12