none
多個同種視窗控制 RRS feed

  • 問題

  • 最近在寫一個鬧鐘的程式,原本一帆風順,但因遇到瓶頸,故來此一問。

    原本是希望使用者按下一個按鈕後能產生一個鬧鐘,並可多開很多個,產生的程式碼如下:

    Form alarms = new Form();
            ComboBox chooseHr = new ComboBox();
            int x = 1;
            Font allLabel = new Font("新細明體", 10, FontStyle.Regular);
    
            void setAlarmsForm()
            {
                alarms = new Form();
                alarms.Size = new Size(442, 300);
                alarms.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
                alarms.Load += new EventHandler(alarms_Load);
                alarms.FormClosing += new FormClosingEventHandler(alarms_FormClosing);
                alarms.Text = "鬧鐘" + x;
                alarms.Name = "alarm" + x;
                x += 1;
                alarmCancelList.Items.Add(alarms.Text);
                comboBox1.Items.Add(alarms.Text);
    
                Label toTimeText = new Label();
                toTimeText.Font = allLabel;
                toTimeText.Location = new Point(12, 9);
                toTimeText.Text = "鈴聲時間:";
                toTimeText.AutoSize = true;
                alarms.Controls.Add(toTimeText);
    
                chooseHr.DropDownStyle = ComboBoxStyle.DropDownList;
                chooseHr.Size = new Size(77, 20);
                chooseHr.Location = new Point(85, 6);
                alarms.Controls.Add(chooseHr);
    
                Label toHrText = new Label();
                toHrText.Font = allLabel;
                toHrText.Location = new Point(168, 9);
                toHrText.Text = "時";
                toHrText.AutoSize = true;
                alarms.Controls.Add(toHrText);
            }
     private void toSetAlarm_Click(object sender, EventArgs e)
            {
                setAlarmsForm();
                alarms.Show();
    
            }

    總覺得打斜那部分怪怪的,測試後果真發現錯誤:當開啟一或多個視窗(鬧鐘)再按按鈕時便會出現

    類型 'System.ObjectDisposedException' 的未處理例外狀況發生於 System.Windows.Forms.dll

    其他資訊: 無法存取已處置的物件。

    如此訊息

    另,若要以程式碼控制其關閉,該如何辨認?


    Windows 7是桌上型電腦最好用的OS 還在用XP的人快來試試吧

    2013年2月4日 上午 09:25

解答

  • 不是 name , 而是物件.

    我們做一個假設好了, 如果你程式這麼寫

    Dim a As New Combobox

    Dim b As Combobox = a

    這時候有兩個變數 a, b , 但他們指向的是同一個物件

    從你的程式來看, 你在全域宣告了  ComboBox chooseHr = new ComboBox();

    而你的方法內卻是這樣

                chooseHr.DropDownStyle = ComboBoxStyle.DropDownList;
                chooseHr.Size = new Size(77, 20);
                chooseHr.Location = new Point(85, 6);
                alarms.Controls.Add(chooseHr);

    也就是每個新的 Form 加進來的都是同一個 ComboBox

    所以你應該把   ComboBox chooseHr = new ComboBox(); 移到方法內部

    如果不瞭解 類別, 物件(執行個體) 和變數的不同. 請參考 Visual Basic 中的物件和類別

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 張源峷 2013年2月5日 上午 11:10
    2013年2月4日 下午 12:15
    版主

所有回覆

  • 你在 Form 上的每一個東西都得是獨立的 Instance , 不可兩個 Form 指向同一個 Instance .

    例如: 你的 chooseHr 這個 Combobox


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年2月4日 上午 10:32
    版主
  • 你在 Form 上的每一個東西都得是獨立的 Instance , 不可兩個 Form 指向同一個 Instance .

    例如: 你的 chooseHr 這個 Combobox


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年2月4日 上午 10:32
    版主
  • 那照這樣看來,我這個產生視窗的方式是行不通的?
    那請問有什麼方式可以達成此目的?

    就是按完按鈕之後產生一個視窗,並可以一直產生同個視窗這樣



    一條線下面(如這條)是簽名檔,看到別弄錯!!!

    2013年2月4日 上午 11:53
  • 我沒說行不通, 重點在於 "每一個 Form 的控制項必須是獨立的個體" , 也就是說, 你所有的控制項產生 Instance , 都應該寫在setAlarmsForm 方法內

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年2月4日 上午 11:55
    版主
  • 是嗎...抱歉誤會了您的意思

    所以您是說產生新的Form的時候,裡面的元件Name也要不同?

    抱歉還是新手還不太熟


    一條線下面(如這條)是簽名檔,看到別弄錯!!!

    2013年2月4日 下午 12:04
  • 不是 name , 而是物件.

    我們做一個假設好了, 如果你程式這麼寫

    Dim a As New Combobox

    Dim b As Combobox = a

    這時候有兩個變數 a, b , 但他們指向的是同一個物件

    從你的程式來看, 你在全域宣告了  ComboBox chooseHr = new ComboBox();

    而你的方法內卻是這樣

                chooseHr.DropDownStyle = ComboBoxStyle.DropDownList;
                chooseHr.Size = new Size(77, 20);
                chooseHr.Location = new Point(85, 6);
                alarms.Controls.Add(chooseHr);

    也就是每個新的 Form 加進來的都是同一個 ComboBox

    所以你應該把   ComboBox chooseHr = new ComboBox(); 移到方法內部

    如果不瞭解 類別, 物件(執行個體) 和變數的不同. 請參考 Visual Basic 中的物件和類別

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 張源峷 2013年2月5日 上午 11:10
    2013年2月4日 下午 12:15
    版主