如何将_Load事件添加到控件中?

本文关键字:控件 添加 事件 Load | 更新日期: 2023-09-27 18:15:42

在c#中,我想给DataGridView控件添加一个_ResizeEnd事件。我找到了一些代码来帮助解决这个问题(允许在usercontrol中添加_ResizeEnd事件)。

private void UserControl1_Load(object sender, EventArgs e)
{
((Form)this.Parent).ResizeEnd += new EventHandler(UserControl1_ResizeEnd);
}
void UserControl1_ResizeEnd(object sender, EventArgs e)
{
MessageBox.Show("Resize end");
}

如前所述,我想调整它以将事件添加到DataGridView中。我所能做的就是创建一个UserControl并将一个DataGridView控件转储到它上面,并按照上面的代码实现_ResizeEnd事件。

然而,这样做的问题是我希望DataGridView的所有属性,方法和事件在设计器中保持暴露。除了编写所有的Get/Set/events/methods等之外,我不知道有一种"简单"的方法来暴露它们(即将子控件方法等暴露给父用户控件)。

我想我可以改变继承:MyDataGridView: UserControl:公共部分类MyDataGridView: DataGridView

这解决了所有的DataGridView属性等暴露给usercontrol的问题,但当然这并没有推动我前进,因为DataGridView类(不像usercontrol类),没有_Load事件。

所以…谁能告诉我怎么解决这个问题?

编辑:顺便说一下……我理解SubClassing应该是:

public partial class MyDataGridView : DataGridView

这确实暴露了DataGridView属性等,但我失去了:UserControl继承,这意味着没有_Load事件暴露。

我不确定如何继承UserControl属性/方法和DataGridView属性等

如何将_Load事件添加到控件中?

为什么要在Load事件中设置ResizeEnd ?为什么不子类DataGridView(这是获得所有现有属性和事件的最佳方式),然后在MyDataGridView内设置事件处理程序?因为您需要的只是父节点,所以我建议您对ParentChanged事件做出反应。下面的方法适合我(注意,我不相信Parent会改变,但是人们可以做一些奇怪的事情:):):

public class CustomDataGridView : DataGridView
{
    private Form _curParent;
    public CustomDataGridView()
    {
        // Since Parent is not set yet, handle the event that tells us that it *is* set
        this.ParentChanged += CustomDataGridView_ParentChanged;
    }
    void CustomDataGridView_ParentChanged(object sender, EventArgs e)
    {
        if (this.Parent is Form)
        {
            // be nice and remove the event from the old parent
            if (_curParent != null)
            {
                _curParent.ResizeEnd -= CustomDataGridView_ResizeEnd;
            }
            // now update _curParent to the new Parent
            _curParent = (Form)this.Parent;
            _curParent.ResizeEnd += CustomDataGridView_ResizeEnd;
        }
    }
    void CustomDataGridView_ResizeEnd(object sender, EventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Resize End called on parent. React now!");
    }
}

好的,谢谢你的帮助。最终的工作代码如下(如果需要改进,可以提出建议!)

 public partial class MyDataGridView : DataGridView
    {
        private Form _curParent = null;
        protected override void OnInvalidated(InvalidateEventArgs e) 
        {
            //Exit if no parent, or _curParent already set.
            if (Parent == null || _curParent != null) return;
            base.OnInvalidated(e);
            //Recurse until parent form is found:
            Control parentForm = Parent;
            while (!(parentForm is Form))
            {
                if (parentForm.Parent == null) return;  //Break if this is a null - indicates parent not yet created.
                parentForm = parentForm.Parent; 
            }
            //Have now found parent form at the top of the ancestor tree.
            // be nice and remove the event from the old parent
            if (_curParent != null)
            {
                _curParent.ResizeEnd -= MyDataGridView_ResizeEnd;
            }
            // now update _curParent to the new Parent
            _curParent = (Form)parentForm;
            //Add the resized event handler
            _curParent.ResizeEnd += MyDataGridView_ResizeEnd;
        }

        void MyDataGridView_ResizeEnd(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("Resize End called on parent. React now!");
        }
    }