none
在 MDI 下,設定 Child Form 獨佔 RRS feed

  • 問題

  • 請問:
    如何在 MDI 下,讓某個子表單獨佔。
    我想在打開程式時,出現登入的子表單獨佔,讓使用者無法使用父表單的功能表。

    謝謝

    2010年7月2日 上午 11:50

解答

  • 順序上應該是這樣說:

    假設

    (1) MDI主表單名稱為 MDI_Form

    (2) Login畫面的獨立表單為 Locing_Form

    此時在Program.cs中的啟始表單應該還是MDI_Form

    (1) MDI_Form的內容

    public partial class MDI_Form : Form
        {
            public MDI_Form()
            {
                InitializeComponent();
            }
            private void MDI_Form_Load(object sender, EventArgs e)
            {
               Login_Form Login = new Login_Form();
                Login._TopForm = this;
                Login.ShowDialog();

            }
              
        }

    (2) Login_Form的內容

     public partial class Login_Form : Form
        {
            public Login_Form()
            {
                InitializeComponent();
            }
            private MDI_Form m_TopForm;
            public MDI_Form _TopForm
            {
                get { return m_TopForm; }
                set { m_TopForm = value; }
            }

            private void button1_Click(object sender, EventArgs e)
            {
                //假設這是驗證通過
                this.Close();
            }

            private void button2_Click(object sender, EventArgs e)
            {
                //假設這是驗證失敗
                this._TopForm.Close();
            }
        }

    這個範例執行的時候, 當MDI_Form Load事件發生, MDI_Form不會馬上出現 (因為Login.ShowDialog(), 會停止MDI_Form的訊息迴圈, 讓它暫止) , 它會將自身的參考指標傳遞給Login_Form (注意幾的粗體字的部份)

    我用兩個Button來模擬是否驗證通過, 如果通過則將Login_Form關閉, 如果失敗則透過剛剛傳遞的參考指標, 將MDI_Form也關掉.

     


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年7月3日 上午 04:02
    版主

所有回覆

  • 2010年7月2日 下午 12:04
    版主
  • 謝謝答覆            

    我在 MdiParent 上的程式如下,使用F5,產生「System.InvalidOperationException 未處理」訊息。

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

    namespace TFDB
    {
        public partial class tfdb : Form
        {
            private int childFormNumber = 0;

            public tfdb()
            {
                InitializeComponent();
                Login childForm = new Login();
                childForm.MdiParent = this;
                childForm.ShowDialog();

            } …(以下略)


    System.InvalidOperationException 未處理
      Message="無法將非最上層表單的表單顯示為強制回應對話方塊。呼叫 showDialog 前請先將表單從任何父表單移除。"
      Source="System.Windows.Forms"
      StackTrace:
           於 System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
           於 TFDB.tfdb..ctor() 於 D:\tfdatabase\TFDB\TFDB\tfdb.cs: 行 22
           於 TFDB.Program.Main() 於 D:\tfdatabase\TFDB\TFDB\Program.cs: 行 18
           於 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           於 System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
           於 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
           於 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           於 System.Threading.ThreadHelper.ThreadStart()
      InnerException:

    2010年7月3日 上午 01:38
  • 喔, 你要直接把登入表單做為子表單喔. 那這樣應該不是獨佔的問題.

    應該是先把除了登入表單以外的所有非Form 類別控制項的Enabled屬性設為False

    當Login 成功後才將其設為True


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年7月3日 上午 02:15
    版主
  • 感謝您從MDI的框架中,把我拉出來。
    現在,我先開LoginForm,登入以後再開 MdiParent,但是為什麼開了又立刻關閉呢?

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

    namespace TFDB
    {
        public partial class Login : Form
        {
            public Login()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
               

            }

            private void button1_Click(object sender, EventArgs e)
            {
               
                tfdb newMDIParent = new tfdb();

                newMDIParent.Show();

                this.Close();

    …略

    2010年7月3日 上午 03:25
  • 順序上應該是這樣說:

    假設

    (1) MDI主表單名稱為 MDI_Form

    (2) Login畫面的獨立表單為 Locing_Form

    此時在Program.cs中的啟始表單應該還是MDI_Form

    (1) MDI_Form的內容

    public partial class MDI_Form : Form
        {
            public MDI_Form()
            {
                InitializeComponent();
            }
            private void MDI_Form_Load(object sender, EventArgs e)
            {
               Login_Form Login = new Login_Form();
                Login._TopForm = this;
                Login.ShowDialog();

            }
              
        }

    (2) Login_Form的內容

     public partial class Login_Form : Form
        {
            public Login_Form()
            {
                InitializeComponent();
            }
            private MDI_Form m_TopForm;
            public MDI_Form _TopForm
            {
                get { return m_TopForm; }
                set { m_TopForm = value; }
            }

            private void button1_Click(object sender, EventArgs e)
            {
                //假設這是驗證通過
                this.Close();
            }

            private void button2_Click(object sender, EventArgs e)
            {
                //假設這是驗證失敗
                this._TopForm.Close();
            }
        }

    這個範例執行的時候, 當MDI_Form Load事件發生, MDI_Form不會馬上出現 (因為Login.ShowDialog(), 會停止MDI_Form的訊息迴圈, 讓它暫止) , 它會將自身的參考指標傳遞給Login_Form (注意幾的粗體字的部份)

    我用兩個Button來模擬是否驗證通過, 如果通過則將Login_Form關閉, 如果失敗則透過剛剛傳遞的參考指標, 將MDI_Form也關掉.

     


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年7月3日 上午 04:02
    版主
  • 喔, 你要直接把登入表單做為子表單喔. 那這樣應該不是獨佔的問題.

    應該是先把除了登入表單以外的所有非Form 類別控制項的Enabled屬性設為False

    當Login 成功後才將其設為True


    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    登入表單是子表單,將MdiParent的Enabled設為False,開啟後,登入表單本身也變成 Enabled 是False了。
    2010年7月3日 上午 04:07
  • 登入表單是子表單,將MdiParent的Enabled設為False,開啟後,登入表單本身也變成 Enabled 是False了。
    我不是註明寫說 "非Form的控制項 " , 有個非字, 意即不能將Form的Enabled屬性設為Flase

    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    2010年7月3日 上午 04:09
    版主
  • 謝謝您這麼快回覆,我須花點時間。
    2010年7月3日 上午 04:11
  • 成功了,非常感謝您。
    2010年7月3日 上午 04:24