none
在 MDI 下,如何從 MdiChild Form 控制 MdiParent Form 的控制項 RRS feed

  • 問題

  • 剛從 VB 進 C#,請教 C# 先進這個問題:
    我在 ParentForm_Load 設定 :   menuStrip.Enabled = false;
    Child Form是登入表單,想讓正確登入後,設定 ParentForm menuStrip.Enabled = true;

    請教,這個程式C#怎麼寫呢?

    謝謝

    2010年7月6日 上午 03:16

解答

所有回覆

  • 主要的技巧就是傳遞主表單的物件參考指標給MDI Child表單, 這樣Child表單就會知道要控制誰.

    請參考以下幾篇原有討論.



    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    • 已標示為解答 Lolota Lee 2010年7月12日 上午 02:09
    2010年7月6日 上午 03:25
    版主
  • 謝謝您,我須要爬文,有成果,再回謝。
    2010年7月6日 上午 03:50
  • 假設ParentForm的類別名稱為Form1, 您可以這樣做(請注意Form1的menuStrip功能表的Modifier屬性要設定成internal):

    ((Form1)ParentForm).menuStrip.Enabled = true;

    2010年7月6日 上午 03:51
  • 主要的技巧就是傳遞主表單的物件參考指標給MDI Child表單, 這樣Child表單就會知道要控制誰.

    請參考以下幾篇原有討論.


    以下略…


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

    請問,我漏掉了什麼Using指示詞呢?我在 Parent Form (tfdbForm) 確定有這個控制項 TextBox1,但仍出現下列錯誤。

    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
        {


     private void button1_Click(object sender, EventArgs e)
            {

                        tfdbForm ParentForm = new tfdbForm();
                        ParentForm.TextBox1.text = this.textBox1.Text; 以下略……

    錯誤 1 'TFDB.tfdbForm' 不包含 'TextBox1' 的定義,也找不到擴充方法 'TextBox1' 來接受型別 'TFDB.tfdbForm' 的第一個引數 (您是否遺漏 using 指示詞或組件參考?) D:\tfdatabase\TFDB\TFDB\Login.cs 49 32 TFDB

    2010年7月6日 上午 04:08
  • 假設ParentForm的類別名稱為Form1, 您可以這樣做(請注意Form1的menuStrip功能表的Modifier屬性要設定成internal):

    ((Form1)ParentForm).menuStrip.Enabled = true;

    我漏掉了什麼呢? 我確定Form1(tfdbForm)的menuStrip功能表的Modifier屬性要設定成internal
    Form1(tfdbForm)的menuStrip的Enabled仍然是False(灰色的)


    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
        {

    private void button1_Click(object sender, EventArgs e)
            {

              ((tfdbForm)ParentForm).menuStrip.Enabled = true;

    以下略……

    2010年7月6日 上午 04:26
  • Hi,

    改為下面這樣呢?

    this.MdiParent.MainMenuStrip.Enabled = true;


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年7月6日 上午 04:46
  •   private void button1_Click(object sender, EventArgs e)
            {

                        tfdbForm ParentForm = new tfdbForm();
                        ParentForm.TextBox1 .text = this.textBox1.Text; 以下略……

    錯誤 1 'TFDB.tfdbForm' 不包含 'TextBox1' 的定義,也找不到擴充方法 'TextBox1' 來接受型別 'TFDB.tfdbForm' 的第一個引數 (您是否遺漏 using 指示詞或組件參考?) D:\tfdatabase\TFDB\TFDB\Login.cs 49 32 TFDB

     你應該在Login 這個Form中設定一個屬性來接收Mdi Parent的參考指標, 而不是去產生一個新的執行個體

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

    改為下面這樣呢?

    this.MdiParent.MainMenyStrip.Enabled = true;


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/


    問題找到了,我的程式沒有真正設定 MdiChlid ,修正以後就可以了【使用:((Form1)ParentForm).menuStrip.Enabled = true;】

    非常謝謝您

    2010年7月6日 上午 06:02
  •  你應該在Login 這個Form中設定一個屬性來接收Mdi Parent的參考指標, 而不是去產生一個新的執行個體

    以下是簽名檔, 請勿沒事對號入座
    MSDN 文件庫很重要
    回應幫助你的人是一種禮貌, 良好的禮貌有助於激發大家對你問題回應的熱情
    進步的人會找尋自己程式中的缺點,半桶水則把自己程式的錯誤推到不相干事物的身上
    謝謝 Bill,
    還是不瞭解,我須再多爬文。
    2010年7月6日 上午 07:27
  • 記得我在這篇回答過

    http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/8c631550-9290-4484-80b5-7d7031d1132c

    我的範例中就有用粗體標明

    在Loging_Form 內容中, 這粗體的部份就是讓Login_Form這個類別自己多一個屬性藉以得知它上層的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; }
            }

         
        }

     

    在 MDI_Form中

                 Login_Form Login = new Login_Form();
                Login._TopForm = this;   <---這就是把MDI_Form自身的參考指標傳遞給Login_Form的執行個體Login
                Login.ShowDialog();

    試著用紙和筆與自己的大腦模擬這個流程, 不要一直靠著電腦幫你跑出結果.

     


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

    我是覺得登入表單當成子視窗是很怪的寫法

    通常應該是用對話框來做

    若要依您這樣的架構下去做

    我還是建議不要把程式寫的太耦合

    在MDI下

    子視窗與父視窗有彼此都有互相可以找到對方的內建機制

    透過MdiParent就可以找到父視窗

    Form.MdiParent 屬性

    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.form.mdiparent(VS.80).aspx

     

    而透過MainMenuStrip則可以取得主選單

    Form.MainMenuStrip 屬性

    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.form.mainmenustrip(v=VS.80).aspx

     

    而您要設的只是選單的Enabled屬性

    這個一般的Control就有了

    繼承它的MenuStrip自然也有

    因此只要像我之前寫的那樣就可以達到需求才是

    若能進一步改成由父視窗自己去控制自己的控制項狀態個人覺得會更好些


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 Lolota Lee 2010年7月12日 上午 02:09
    2010年7月7日 上午 04:57