【问题标题】:Unable to get declared event in vb.net无法在 vb.net 中获得声明的事件
【发布时间】:2014-08-11 13:09:40
【问题描述】:

我已将以下 c# 代码转换为 vb.net。

问题是无法让一个类中的声明事件在另一个对象中访问。

详情请看以下;

c#代码如下:

public Dropdown(CheckedComboBox ccbParent)
{
   this.ccbParent = ccbParent;
   InitializeComponent();
   this.ShowInTaskbar = false;                      
   this.cclb.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.cclb_ItemCheck);
}

private void cclb_ItemCheck(object sender, ItemCheckEventArgs e)
{
   if (ccbParent.ItemCheck != null)
   {
      ccbParent.ItemCheck(sender, e);
   }
}

vb.net

 Public Class CheckedComboBox
Inherits ComboBox


Public Event ItemCheck As ItemCheckEventHandler   

....

End Class
Private cclb As CustomCheckedListBox
   Public Event ItemCheck As Windows.Forms.ItemCheckEventHandler
   Public Sub New(ByVal ccbParent As PlexisCheckedComboBox)
   MyBase.New()
   Me.ccbParent = ccbParent
   InitializeComponent()
   Me.ShowInTaskbar = False
   AddHandler cclb.ItemCheck, AddressOf cclb_ItemCheck
End Sub

Private Sub cclb_ItemCheck(ByVal sender As Object, ByVal e As Windows.Forms.ItemCheckEventArgs)
   If (Not (ccbParent.ItemCheck) Is Nothing) Then
      ccbParent.ItemCheck(sender, e)
   End If
End Sub 

在转换后的 vb.net 代码中,我在以下行中出现错误

If (Not (ccbParent.ItemCheck) Is Nothing) Then
   ccbParent.ItemCheck(sender, e) 

请帮助我如何解决它。 ItemCHeck 无法访问。

【问题讨论】:

  • 请注意您的代码格式。目前到处都是,让您的问题真的难以阅读。您已经提出了 53 个问题 - 您现在应该可以正确格式化帖子了。
  • 感谢格式化。我参与了格式化,但不能......很快就会看到帮助。请任何人指导我上述问题的原因是什么。在许多 optins 中尝试了引发事件示例,但在上面的示例中不起作用。能够访问在ccbParent 中声明的其他属性,但无法访问已声明的ccbParent.ItemCheck 事件。
  • 构造函数参数与属性同名并没有帮助。请看我的回答。
  • 请指导我为什么它被否决...所以,我可以进一步照顾。这是我面临的正确问题。

标签: c# vb.net events delegates


【解决方案1】:

你的C#代码直接翻译如下;

Public Sub New(pCCBParent As CheckedComboBox)
    Me.ccbParent = pCCBParent
    InitializeComponent()
    Me.ShowInTaskbar = False
    AddHandler Me.cclb.ItemCheck, Me.cclb_ItemCheck
End Sub

Private Sub cclb_ItemCheck(sender As Object, e As ItemCheckEventArgs)
    RaiseEvent ccbParent.ItemCheck(sender, e)
End Sub

请注意两种语言之间的差异 - 很少有东西不能逐字逐句翻译。

【讨论】:

  • 现在,它在构造函数处出错 - Add Handler... 行说 -Argument not specified for parameter e......
  • 另外,关于 RaiseEvent 的错误仍然存​​在 - ccbParent.ItemCheck is not found
  • 抱歉,我没有 CheckedComboBox 对象来测试它。你自己创造的吗?
  • 请检查包含该事件声明的更新问题。通过ccbParent.Itemcheck访问时找不到。
  • 您不能在派生类中引发基类事件(所以我认为原始 C# 示例也存在缺陷)。
【解决方案2】:

我已在外侧声明 sub 如下。并调用ccbParent.RaiseItemCheckEvent(sender,e)

 Public Sub RaiseItemCheckEvent(ByVal sender As Object, ByVal e As ItemCheckEventArgs)
    RaiseEvent ItemCheck(sender, e)
End Sub

感谢大家的cmets。

【讨论】:

    【解决方案3】:

    您不能直接从派生类引发基类事件 - 请尝试以下操作:

    Class CheckedComboBox
        Inherits ComboBox
    
        Public Event ItemCheck As Windows.Forms.ItemCheckEventHandler
    
        Protected Sub RaiseItemCheckEventFromDerivedClass(ByVal sender As Object, ByVal e As ItemCheckEventArgs)
            RaiseEvent ItemCheck(sender, e)
        End Sub
    End Class
    
    Class DropDown
        Inherits CheckedComboBox
    
        Private ccbParent As CheckedComboBox
    
        Private Sub New(ByVal ccbParent As CheckedComboBox)
            Me.ccbParent = ccbParent
            AddHandler ccbParent.ItemCheck, AddressOf cclb_ItemCheck
        End Sub
    
        Private Sub cclb_ItemCheck(ByVal sender As Object, ByVal e As ItemCheckEventArgs)
            RaiseItemCheckEventFromDerivedClass(sender, e)
        End Sub
    End Class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2010-10-30
      • 1970-01-01
      相关资源
      最近更新 更多