我已经为搜索做了一个用户控件。在搜索时,弹出窗口将打开。现在,我想从用户控件访问 Form_Resize 和 Form_LocationChanged 事件。
答案 0 :(得分:1)
在Control构造函数中,您必须订阅控件的ParentChanged
事件,以了解何时可以获取控件的当前父级。
public YourControl()
{
InitializeComponent();
ParentChanged += OnParentchanged;
}
private void OnParentchanged(object sender, EventArgs e)
{
// maybe get Form istead of just parent control
Parent.Resize += OnParentResize;
Parent.LocationChanged += OnParentLocationChanged;
}
然后您必须订阅所需的表单事件。
问题是,您的控件的Parent
可能是另一个控件,因此您可能希望递归搜索所有Parents
,直到它的形式。只是不是那么清楚你想要实现什么。
此外,请记住,如果更改,您可以取消订阅上一个父项的事件。但这是另一个也是一个非常棘手的问题。
修改强>
您不需要自己递归搜索表单,有FindForm()
方法,@ jmcilhinney提到
答案 1 :(得分:0)
每个控件都有一个FindForm
方法,它将返回包含控件的表单,即使层次结构中存在其他控件也是如此。一旦您获得对表单的引用,您就可以使用与运行时任何其他对象完全相同的方式处理其事件。
答案 2 :(得分:0)
如果您尝试从构造函数访问它,则Parent对象可能为null。我要做的是在UserControl的Load事件中添加引用。
private void CustomControl_Load(object sender, EventArgs e)
{
ParentChanged += OnParentChanged;
}
private void OnParentChanged(object sender, EventArgs e)
{
Parent.Resize += OnParentResize;
Parent.LocationChanged += OnParentLocationChanged;
// More events or
// Do Something...
}