标题:求教:窗体的 静态 类变量的 作用
只看楼主
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
结帖率:91.67%
已结贴  问题点数:20 回复次数:52 
求教:窗体的 静态 类变量的 作用
EmpList.rar (45.67 KB)


发上代码附件

我的问题是:

为什么 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; 会出现 “未将对象引入实例”错误

         
        }
    }
}
搜索更多相关主题的帖子: public parent null 
2014-02-02 11:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
在甲對象調用乙對象的邏輯原因是什麽?

授人以渔,不授人以鱼。
2014-02-02 11:40
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
以下是引用TonyDeng在2014-2-2 11:40:11的发言:

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

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

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

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

万分感谢您的帮教!!!
2014-02-02 11:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你不是要在GetScore類的窗體(甲)上調用Emp類的窗體(乙)的方法嗎?這樣做的理由是什麽呢?你想象一下,這是甲乙兩個不同的部門,你在甲部門工作,希望乙部門做什麽事,爲什麽不是讓它自己處理(由乙部門自己調用方法)而是你甲部門直接調用乙部門的方法?這合管理原則嗎?這其實不是能不能做到的問題,而是是否應該這樣做的問題,之所以要設計爲這樣調用,就是這個原因。

[ 本帖最后由 TonyDeng 于 2014-2-2 11:59 编辑 ]

授人以渔,不授人以鱼。
2014-02-02 11:58
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
里氏替换原则:父类对象 指向 子类实例  Father f = new Son (); 这是 继承逻辑关系,所以可以。

但1楼的问题,好像不是这个吧?
2014-02-02 12:00
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
以下是引用TonyDeng在2014-2-2 11:58:35的发言:

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

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

没太明白,让我的榆木脑袋想想。万分感谢您!!!
2014-02-02 12:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你Emp類和GetScore類是兩個不同的類,去調用父類的方法幹什麽?你的對象從類生成,不是從父類生成,調用父類的非靜態方法,當然要有父類的對象實例才行了!你這個設計,是相當彆扭的,直接在類上公開一個方法,讓別的對象調用就可以了,不需要用靜態,BindList()本身在邏輯上就不該是類行爲。

授人以渔,不授人以鱼。
2014-02-02 12:07
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
以下是引用TonyDeng在2014-2-2 12:07:06的发言:

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

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

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

求您指导:
1.这个 静态类变量 为什么可以,而实例化窗体对象则不能调用?
2.好的合理代码,应该如何写呢?(“直接在類上公開一個方法”  与  “BindList()本身在邏輯上就不該是類行爲”---- 不太理解??)
2014-02-02 12:18
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
“你Emp類和GetScore類是兩個不同的類,去調用父類的方法幹什麽?”

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

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

感谢 TonyDeng 老师指点!!!

[ 本帖最后由 learnerok 于 2014-2-2 12:35 编辑 ]
2014-02-02 12:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
程序代码:
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; 会出现 “未将对象引入实例”错误

         
        }
    }
}



授人以渔,不授人以鱼。
2014-02-02 12:34



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-426994-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.847820 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved