标题:求教:窗体的 静态 类变量的 作用
只看楼主
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
以下是引用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);
            }
        }
2014-02-04 22:08
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
以下是引用TonyDeng在2014-2-4 20:47:32的发言:

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

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

多谢您的指导!!!
2014-02-04 22:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
都不知道應該怎麽教你,前面説過的又要返回頭說:這種方法——至少在你目前的應用上——是彆扭的、不合邏輯的旁門辦法。
後一個問題爲什麽錯,已經告訴你什麽原因了。

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

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

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

多谢您!!!

[ 本帖最后由 learnerok 于 2014-2-5 08:49 编辑 ]
2014-02-04 22:52
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
等问题搞明白了,再结贴,可以吗?
多谢版主!!!
2014-02-05 12:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你自己看看這個點擊動作做的是什麽?看注釋了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 编辑 ]

授人以渔,不授人以鱼。
2014-02-05 14:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
另外,最好不要動不動就彈窗,用戶感受不好的,也增加編程的麻煩,事實上你現在遇到的問題就是彈窗造成的,如果界面在同一個窗體上,就不會遇到這種問題。

授人以渔,不授人以鱼。
2014-02-05 14:21
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
很感谢TonyDeng老师的 指导,获得了不少新概念,比如数据要与界面分离,虽然学了点三层架构,但概念还是比较生疏的。

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

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

谢谢您!!!
2014-02-05 16:09
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:2 
你在點擊【評分】的方法中設置斷點,逐行跟踪程序的流程看看都幹了些什麽不就知道了麽。

授人以渔,不授人以鱼。
2014-02-05 16:30
learnerok
Rank: 2
等 级:论坛游民
帖 子:387
专家分:47
注 册:2011-5-21
得分:0 
以下是引用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);
            }
        }
2014-02-05 16:46



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




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

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