2012-09-04 82 views
1

我已經添加了我的主類,從中我調用按鈕類,這就是它應該打印出按鈕的地方。代碼編譯好,但我看不到實際的按鈕。在我看來,它沒有繼承控件屬性。謝謝!控件不能正常工作

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

    //main class 
    namespace Test 
    { 
    public partial class Form1 : Form 
    { 
    buttons button1; 

    public Form1() 
    { 
     InitializeComponent(); 
     print_button(); 
    } 

    private void print_button() 
    { 
     button1 = new buttons(); 
     button1.print(); 
    } 


    }//form 
    }//test 

//---------------------------------------------------------------// 

//buttons class 
namespace Test 
{ 
    public class buttons : System.Windows.Forms.Control 

    class buttons 
    { 
    private Button button1; 

    public buttons() 
    { 

    } 

     public void print() 
     { 
      button1 = new Button(); 
      button1.Location = new System.Drawing.Point(82, 44); 
      button1.Size = new System.Drawing.Size(977, 54); 
      button1.Text = "next"; 
      Controls.Add(button1); 
    } 
    }//class 
}//test 
+1

Oh man ...對於'Controls'來說,這個方法應該在** form **或'buttons'裏面,應該繼承'Control'。我相信你想要第一個。 –

+0

謝謝,我已經添加了繼承,但是我仍然無法看到表單 –

+0

上的實際標籤請發佈一些關於您的項目的更多信息。它是什麼類型(Win窗體,Web窗體,...),你正在嘗試。 –

回答

1

我不知道你在用你提供的代碼來完成什麼。在任何情況下的原因,這方法行不通:

public void print() 
{ 
    button1 = new Button(); 

    button1.Location = new System.Drawing.Point(82, 44); 
    button1.Size = new System.Drawing.Size(977, 54); 
    button1.Text = "next"; 
    Controls.Add(button1); 
} 

是因爲類「按鈕」沒有定義控件集合,也不由露出一個控件集合類繼承。例如,如果你要這樣做:

public class buttons : System.Windows.Form 
{ 
    ... 
} 

因爲Form類暴露了Controls集合,所以你的代碼至少會編譯。儘管您嘗試完成的內容並不完全清楚,但是這種解決方案可能不適合您的需求。酌情發佈更多信息,我會盡我所能來幫助你。

-----編輯

好像你正試圖從以上您的意見一個重構你的Form1類。

你可以做這樣的事情:

public class Form1 : Form 
{ 
    public void foo() 
    { 
     Controls.Add(buttons.print()); 
    } 
} 

,並修改按鈕類爲:

public class buttons 
{ 
    public static Button print() 
    { 
    Button btn = new Button(); 
    btn.Location = new System.Drawing.Point(82, 44); 
    btn.Size = new System.Drawing.Size(977, 54); 
    btn.Text = "next"; 
    return btn; 
    } 
} 

這會再添加一個按鈕,你的主窗體的控件集合,一旦它被調用。雖然這個方法沒有用,因爲它只能一遍又一遍地產生相同的按鈕。

public void foo() 
    { 
     Controls.Add(buttons.print(new System.Drawing.Point(82, 44), new System.Drawing.Size(977, 54), "button text")); 
    } 

這是否幫助:這樣它看起來像這樣

public static Button print(Point buttonLocation, Size buttonSize, string buttonText) 
    { 
    Button btn = new Button(); 
    btn.Location = buttonLocation; 
    btn.Size = buttonSize; 
    btn.Text = buttonText; 
    return btn; 
    } 

然後主要形式是這樣的我會修改的方法?

---編輯2 ---

我提供此編輯爲你怎麼可以讓你的主類(表)每個註釋中的OP的請求「清潔」一個嚴格的學術例子。我不建議在生產中使用此方法,而是建議使用MVC,MVP或MVVP等模式。我在這裏排除了這些模式的例子,因爲我認爲他們在這個時候超過了OP的技能水平,只會導致更多的混淆。

考慮以下幾點:

public class buttons 
{ 
     private Form _form = null; 
     public buttons(Form form) 
     { 
     _form = form; 
     } 

     public void print(Point buttonLocation, Size buttonSize, string buttonText) 
     { 
     Button btn = new Button(); 
     btn.Location = buttonLocation; 
     btn.Size = buttonSize; 
     btn.Text = buttonText; 
     _form.Controls.Add(btn); 
     }  
} 

public class Form1 : Form 
{ 
    private buttons _buttons = null; 
    public Form1() 
    { 
     _buttons = new buttons(this); 
    } 

    public void foo() 
    { 
     buttons.print(new System.Drawing.Point(82, 44), new System.Drawing.Size(977, 54), "button text"); 
    } 
} 

現在,這裏是正在發生的事情:當Form1中實例化它創建按鈕類的新實例,並將進入按鈕的構造函數(_buttons =新按鈕自身的引用(this))在內部,按鈕類將此引用設置爲局部變量_form,因此,您對變量_form所做的任何操作就像直接對Form1執行操作一樣。正如你可以看到的那樣,在print()方法中創建一個按鈕,然後將其添加到_form的Controls集合中,這與從Form1中調用Controls.Add相同。

這對你有意義嗎?

+0

是的,我已經添加了一些信息。我會很感激,如果你可以看看 –

+0

正如@Andre Calil直接在你的文章評論中指出的那樣,不需要單獨的類或print()方法。如果你有什麼是字面上你試圖實現簡單的移動到Form1類的打印方法。 – dparsons

+0

是非常好的解釋!謝謝。但是,我仍然想知道是否有更簡單的方法來解決這個問題。不管怎樣,我只是將我的按鈕添加到按鈕類中的控件?這對我來說更有意義,它讓我的主班更清潔。但是,非常感謝您的幫助:) –

1

buttons類不是System.Windows.Forms.Control子類,所以它沒有this.Controls成員。

我建議使用在VS中使用WinForms設計器,而不是手動創建自己的窗體或控件,至少在初學者的時候。

我還注意到你應該符合.NET風格約定。類和公共成員應該使用TitleCase並且應該存在於名稱空間中。將buttons更改爲Buttons(如果要使用該名稱)並將其包裝在namespace塊中。