2014-11-23 60 views
1

我對C#很陌生。動態創建表單和容器

下面是我試圖在代碼內創建表單和容器的代碼;但我遇到了問題。

  1. 我從一個新的Windows Forms Application模板開始。
  2. 我稍微更改Program.cs文件,以便我能夠動態創建FormMain
  3. 當行Container.Add(BtnClose)BtnClose_Setup()FormMain.cs被註釋掉時,代碼編譯並運行。但是,該計劃仍然存在一些不可思議的結果。

(a)本形式FormMain假定在(20,20)(左上角)展現出來,作爲FormMain_Setup說;但是當我運行應用程序時,雖然寬度&高度設置按預期顯示(800,600),但左上角每次都會更改(不會粘到20,20)。 (b)esc鍵按預期工作並關閉窗體和應用程序。

  • 當線Container.Add(BtnClose)FormMain.csBtnClose_Setup()評論,代碼編譯,但它在運行時VS向我發送一條消息:「未處理的異常類型的「系統。 TypeInitializationException'發生在mscorlib.dll
  • 有人能告訴我我做錯了什麼嗎?

    Program.cs文件:

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Threading.Tasks; 
    using System.Windows.Forms; 
    
    namespace test { 
        static class Program { 
         public static FormMain FormMain = new FormMain(); 
         [STAThread] 
         static void Main() { 
          Application.Run(FormMain); 
         } 
        } 
    } 
    

    FormMain.cs文件:

    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Windows.Forms; 
    
    namespace test { 
        public partial class FormMain : Form { 
         Button BtnClose = new Button(); 
         public void BtnClose_Setup() { 
          BtnClose.Text = "Ok"; 
          BtnClose.Top = 500; 
          BtnClose.Left = 700; 
         } 
         public void FormMain_Setup() { 
          Top = 20; 
          Left = 20; 
          Width = 800; 
          Height = 600; 
          KeyDown += FormMain_KeyDown; 
          //Container.Add(BtnClose); 
          //BtnClose_Setup(); 
         } 
         void FormMain_KeyDown(object sender, KeyEventArgs e) { 
          if(e.KeyCode == Keys.Escape) { 
           Close(); 
          } 
         } 
         public FormMain() { 
          InitializeComponent(); 
          FormMain_Setup(); 
         } 
        } 
    } 
    

    回答

    1

    默認窗體中StartPosition設置爲WindowsDefaultLocation。您需要將其設置爲手動;無論是在設計師還是在代碼中。

    要將控件添加到窗體,您希望將其添加到窗體的控件集合,而不是Container。

    此外,如果您希望表單在添加按鈕後繼續獲得KeyDown事件,則需要將KeyPreview設置爲true。

    public void FormMain_Setup() 
    { 
        StartPosition = FormStartPosition.Manual; 
        KeyPreview = true; 
        Top = 20; 
        Left = 20; 
        Width = 800; 
        Height = 600; 
        KeyDown += FormMain_KeyDown; 
        Controls.Add(BtnClose); 
        BtnClose_Setup(); 
    } 
    
    +0

    與重寫默認方法相比,這似乎是一個更好的解決方案。 – ssd 2014-11-23 12:27:26

    2

    呼叫Controls.Add(BtnClose);,而不是Container.Add(BtnClose);

    至於固定表格位置:設置​​屬性。

    正確關閉Esc鍵的形式,覆蓋ProcessCmdKey方法:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
        if (keyData == Keys.Escape) 
        { 
         Close(); 
         return true; 
        } 
    
        return base.ProcessCmdKey(ref msg, keyData); 
    } 
    
    +0

    試過了。現在代碼編譯& run;然而這次esc鍵沒有關閉窗體(&app)。表格的左上角仍然不會粘住(20,20)。 – ssd 2014-11-23 11:52:13

    +0

    查看更新的答案 – whyleee 2014-11-23 11:56:59

    +0

    非常感謝。現在我到了某個地方。 – ssd 2014-11-23 12:02:03