2012-07-17 116 views
1

我有一個表單和我自己製作的兩個自定義UserControl。一個控件有一些按鈕,這些按鈕中的每一個都將Tag屬性設置爲PointF的數組。我有另一個UserControl具有ObservableCollection<PointF[]>,我設置它的事件處理程序來繪製行,如果數據被添加到它。這工作正常如果我把數據點放在它自己的類上...只是確保它的工作。從UserControl傳遞數據到另一個

不是我的問題是,如果在一個表單中有兩個控件,我怎樣才能在第一個控件中設置按鈕的點擊事件,將數據點添加到第二個控件?

這兩個控件都在我的soloution兩個不同的項目。並且這些控件的顯示形式也在不同的項目中(它是solotion的啓動項目)

回答

2

將事件添加到第一個控件。

public event EventHandler<EventArgs> Control1ButtonClicked; 
private void OnClicked() 
{ 
    var handler = Control1ButtonClicked; 
    if (handler != null) 
    { 
     handler(this, new EventArgs()); 
    } 
} 

private void Button1_Click(object sender, EventArgs e) 
{ 
    OnClicked();  
} 

在主應用程序中的屬性添加到第二控制

public ObservableCollection<PointF[]> MyPoints{ get; set;}; 

然後添加一個監聽器

userControl1.Control1ButtonClicked += new EventHandler<EventArgs>(userControl1_Control1ButtonClicked); 

void userControl1_Control1ButtonClicked() 
{ 
    //Do Something to control 2 
    userControl2.MyPoints.Add() = //Whatever 
} 
+0

如果用戶控件是實例,此屬性不需要是靜態的? – 2012-07-17 20:49:00

2

您可以在接收PointF數組的第二個usercontrol上添加一個公共方法,然後在裏面此方法可以將PointF添加到您的集合中。

編輯:爲了處理第一個用戶控制

第一用戶控件內內的點擊事件中添加事件,並要求委託

public delegate void OnClickPointDataEvent(object sender, PointF[] data); 
public event OnClickPointDataEvent ClickPointData; 

然後Form_Load事件訂閱的UserControl1事件

uc1.ClickPointData += new UserControl1.OnClickPointDataEvent(form_subscribe_event); 

private void form_subscribe_event(object sender, PointF[] data) 
{ 
    uc2.SomePublicMethod(data); 
} 

最後,在第一個用戶控件按鈕裏面點擊調用處理表格內部事件的代碼

.... 
if(ClickPointData != null) 
    ClickPointData(pointf_array); 
... 
+0

這就是問題,我怎麼能發送數據到第二控制?我無法參考該控件。其實我想要這個機制託管在第一個控制。 – 2012-07-17 20:29:34

+0

讓我明白。你有兩個用戶控件在同一個表單上。第一個被稱爲(例如)'uc1'和第二個'uc2'(兩者都是通過InitializeComponent定義和初始化的)。你確定你不能調用'uc2.SomePublicMethod(uc1.Button.Tag作爲PointF);' – Steve 2012-07-17 20:37:39

+0

這將工作我猜,但我知道我想這個工作的代碼在uc1的代碼裏面。我已經在uc2上有一個接收PointF數組的公共方法,我想在第一個控件中有一些代碼可以響應它內部按鈕的點擊事件。顯然,一個事件將是必需的,它應該以承載兩個控件的形式訂閱。 – 2012-07-17 20:48:00

相關問題