【问题标题】:Subscribing Events in C# Code在 C# 代码中订阅事件
【发布时间】:2016-07-08 08:44:38
【问题描述】:

我将一段代码从 VB 转换为 C#。 VB 中的 UI 有一个按钮 ButNewOrder。 单击按钮后,以下方法将在 VB 代码中执行

 Public Sub mnuFileNewJob_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles ButNewOrder.Click
        Dim ErrorFlag As ErrorFlagType = InitErrorFlag()
        Try
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor
            StatusText = "Loading New Job."
            LoadNewSoftJob(Me)
            System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default
        Catch ex As Exception
            ErrorFlag.NumErrors += 1
            ReDim Preserve ErrorFlag.ErrorDef(ErrorFlag.NumErrors - 1)
            With ErrorFlag.ErrorDef(ErrorFlag.NumErrors - 1)
                .Description = "Error Loading New Job: " + ex.Message
                .Number = ErrorFlag.NumErrors - 1
            End With
        End Try
        If ErrorFlag.NumErrors > 0 Then
            Dim ErrFrm As New FrmErrList
            ErrFrm.ErrorFlag = ErrorFlag
            ErrFrm.Show()
        End If
    End Sub

上面的代码当我转换成C#时,我得到了这个

public void mnuFileNewJob_Click(System.Object eventSender, System.EventArgs eventArgs)
        {
            Mold_Power_Suite.Model.FrontEndStructures.ErrorFlagType ErrorFlag = FrontEndStructures.InitErrorFlag();
            try
            {
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
                ModSoftFrontEndGlobalVariables.StatusText = "Loading New Job.";
                frmMain main = new frmMain();
                MainMod.LoadNewSoftJob(this);// I think I need to replace this with the form name
                System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
            }
            catch (Exception ex)
            {
                ErrorFlag.NumErrors += 1;
                Array.Resize(ref ErrorFlag.ErrorDef, ErrorFlag.NumErrors);
                var _with1 = ErrorFlag.ErrorDef[ErrorFlag.NumErrors - 1];
                _with1.Description = "Error Loading New Job: " + ex.Message;
                _with1.Number =Convert.ToInt16( ErrorFlag.NumErrors - 1);
            }
            if (ErrorFlag.NumErrors > 0)
            {
                FrmErrList ErrFrm = new FrmErrList();
                ErrFrm.ErrorFlag = ErrorFlag;
                ErrFrm.Show();
            }
        }

在 C# 应用程序中单击按钮不会产生任何结果。双击按钮会生成以下存根,这意味着按钮的单击事件没有任何关联。

private void ButNewOrder_Click(object sender, EventArgs e)
        {

        }

我想知道如何让我的按钮执行和VB代码一样的功能?

【问题讨论】:

  • 在ButNewOrder点击事件中绑定mnuFileNewJob_Click事件。

标签: c# vb.net winforms


【解决方案1】:

这是 VB 的 AddHandler 语句的 C# 版本:

ButNewOrder.Click += new System.EventHandler(this.mnuFileNewJob_Click);

这行代码通常由表单设计器添加到您的InitializeComponent() 方法中,但从技术上讲,您可以将它放在几乎任何地方。将其放置在表单开始的位置附近会获得最佳结果。

【讨论】:

  • @Apoorv:VB 使用Handles 子句,这是等价的。
  • 确实如此;它只是使用 'Handles' 子句而不是 AddHandler 语句来连接它。 ButNewOder.Click += this.mnuFileNewJob_Click; 是 C# 与 VB 的 AddHandler 的对等。 C# 无法与 Handles 对等。
  • 请参阅 thisthisthis 了解有关表单关闭问题的想法。
  • 后面的代码一定是指设计器部分类。不,C# 在设计器中做到了。 VB 及其Handles 子句能够在主类中执行此操作(如您发布的代码中所示)。
  • @Apoorv:如果我的回答解决了你的问题,你会这样标记它吗?如果没有,请告诉我,我会继续提供帮助。
【解决方案2】:

当您的按钮被选中时,您可以导航到 Visual Studio 中的 Properties->Events(事件表示为一个螺栓),然后在单击事件下拉列表中选择您的方法。

或者在构造函数中添加这个:

ButNewOrder += mnuFileNewJob_Click

或者,您可以导航到窗口的设计器代码(进入InitializeComponent()),并将ButNewOrder += ButNewOrder_Click 替换为ButNewOrder += mnuFileNewJob_Click

【讨论】:

  • 它是一个基于 WinForms 的项目。我在哪里可以找到活动?
  • @Apoorv 单击按钮一次,属性窗口的右下角会出现一个螺栓。如果没有属性窗口,右键单击按钮并按属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 2023-02-09
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多