2012-03-14 60 views
0

我在這個解決方案中有兩個項目:ProjectA和ProjectB。 ProjectA是主要的啓動項目,並且引用了ProjectB。如何在單獨項目的類中訪問MainForm?

ProjectA有一個名爲MainForm.cs的文件,其中包含一個文本框和主UI。

ProjectB在Shapes.cs中有一個類,它包含我們正在使用的特定結構。 Shapes.cs包含一個事件,當用戶更改該對象的某些文本時會觸發該事件。

我需要做的是捕獲該文本並在MainForm.cs中設置文本框爲該文本。有沒有辦法可以做到這一點?基本上我沒有看到Shapes.cs中的主窗體的任何引用。我想這樣做:

(Shape1.Parent as MainForm).TextBox1.Text = Shape1.Name; 

,假設用戶鍵入一個字符串,它存儲在Shape1.Name中。我需要將其升級到主窗體。

我搜索了其他問題,我發現最接近的領導是Matt Hamsmith的答案this question.但是,如果這是一個好方法,我應該遵循,我不知道如何在主窗體中分配一個事件處理函數在單獨的課堂中的事件。我將不勝感激任何幫助。

謝謝。

+0

Matt的回答是正確的。看到另一個例子:http://stackoverflow.com/questions/3360117/raise-custom-events-in-c-sharp-winforms – NotMe 2012-03-14 03:41:48

+0

謝謝。更多的例子和更多的解釋總是一件好事。 – SoftwareGuy 2012-03-15 00:35:26

回答

2

如果表單由子控件組成,它應該監聽這些控件上的事件,而不是試圖將其父類作爲特定類型轉換的控件。這樣做意味着您的控件只能在該窗體上運行。它打破封裝。

聽這樣的事件:

public class MainForm : Form 
{ 
    Shape _shape1 = new Shape(); 

    public MainForm() 
    { 
     InitializeComponent(); 
     _shape.ShapeNameChanged += HandleShapeNameChanged; 
    } 

    public void HandleShapeNameChanged(object sender, ShapeChangeEventArgs e) 
    { 
     textBox1.Text = e.NewName; 
    } 
} 

public class Shape 
{ 
    public event EventHandler<ShapNameChangedEventArgs> ShapeNameChanged; 
} 

我已經離開它給你:

  1. 定義ShapeNameChangedEventArgs對象包含你想讓它什麼狀態。
  2. 控件上的某些內容發生變化時調用該事件。

祝你好運!

+0

謝謝。這是一個有點工作(至少對我來說),但它最終奏效了! – SoftwareGuy 2012-03-15 00:34:55

相關問題