2012-07-17 117 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

相关问题