需要另一个 class 中的事件处理程序

Need event handler in another class

我有一个用户控件(下面代码中的 VCtrlDetails)托管一个私有的数据网格(detailsGrid)。 现在,我将此控件加载到另一个用户控件 (UcResult_Details) 中,我想在另一个用户控件中处理网格选择更改事件。

    public partial class VCtrlDetails : UserControl
    {
        public event EventHandler<bool> EnableEditTemplateButton;
        private void InitializeComponent()
        {
             private System.Windows.Forms.DataGrid detailsGrid;
             this.detailsGrid.SelectionChanged += new 
               System.EventHandler(this.detailsGrid_SelectionChanged);
        
         }
        private void detailsGrid_SelectionChanged(object sender, EventArgs e)
        {
            EnableEditButton?.Invoke(this, IsApproved());
        }  
        public bool IsApproved()
        {  }
   }

public partial class UcResult_Details : UserControl
{
    private readonly VCtrlDetails vCtrlDetails;
    
    UcResult_Details()
    {
         //Need to subscribe to vCtrlDetails' grid selection changed event here in this ctor
    }      

}

我不太精通事件处理程序,因此坚持使用解决方案,因为网格对象在用户控件中是私有的 'VCtrlDetails',因此不能直接执行以下操作: vCtrlDetails.detailsGrid.SelectionChanged += DetailsGrid_SelectionChanged

您需要将事件从 VCtrlDetails class 中冒出来。您可以通过在 VCtrlDetails class 中创建一个事件并允许您的 UcResult_Details class 订阅它来实现。

public partial class VCtrlDetails : UserControl
{
    public event EventHandler<bool> EnableEditTemplateButton;
    public event EventHandler<EventArgs> DetailsGridSelectionChanged;

    private void InitializeComponent()
    {
         private System.Windows.Forms.DataGrid detailsGrid;
         this.detailsGrid.SelectionChanged += new 
             System.EventHandler(this.detailsGrid_SelectionChanged);
        
    }

    private void detailsGrid_SelectionChanged(object sender, EventArgs e)
    {
        EnableEditButton?.Invoke(this, IsApproved());

        //Raise your custom event
        DetailsGridSelectionChanged?.Invoke(this, e);
    }  

    public bool IsApproved()
    {
    }
}

public partial class UcResult_Details : UserControl
{
    private readonly VCtrlDetails vCtrlDetails;
    
    UcResult_Details()
    {
         //Need to subscribe to vCtrlDetails' grid selection changed event here in this ctor
         this.vCtrlDetails.DetailsGridSelectionChanged += new 
             EventHandler(this.vCtrlDetailsSelectionChanged);
    }

    private void vCtrlDetailsSelectionChanged(object sender, EventArgs e)
    {
        //Do whatever
    }
}