2015-11-09 3 views
4

Я, вероятно, столкнулся с проблемой Visual Studio 2015. Если вы определяете три обработчика одного и того же события с использованием WithEvents и Handles ключевых слов, один из обработчиков не будет вызываться. Я проследил это поведение в нашем программном обеспечении и написал следующий образец проекта WinForms.Ошибка WithEvents в Visual Studio 2015?

Public Class MainBase1 
    Inherits Form 

    Protected WithEvents Button1 As Button 
    Protected TextBox1 As TextBox 

    Public Sub New() 
     SuspendLayout() 

     Text = "WithEvents Test" 
     ClientSize = New Size(300, 300) 

     Button1 = New Button() 
     Button1.Location = New Point(10, 10) 
     Button1.Size = New Size(100, 25) 
     Button1.Text = "Button1" 
     Controls.Add(Button1) 

     TextBox1 = New TextBox() 
     TextBox1.Location = New Point(10, 50) 
     TextBox1.Multiline = True 
     TextBox1.Size = New Size(280, 240) 
     Controls.Add(TextBox1) 

     ResumeLayout(False) 
     PerformLayout() 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     TextBox1.Text &= "MainBase1: Button click handled." & vbNewLine 
    End Sub 
End Class 


Public Class MainBase2 
    Inherits MainBase1 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     TextBox1.Text &= "MainBase2: Button click handled." & vbNewLine 
    End Sub 
End Class 


Public Class Main 
    Inherits MainBase2 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     TextBox1.Text &= "Main: Button click handled." & vbNewLine 
    End Sub 
End Class 

После нажатия Button1Textbox1 содержит

MainBase1: Button click handled. 
Main: Button click handled. 

Если я компилирую тот же образец под Visual Studio 2012, я получаю

MainBase1: Button click handled. 
MainBase2: Button click handled. 
Main: Button click handled. 

ли кто-нибудь сталкивался с такой вопрос, а? Или я что-то пропустил?

+3

Это еще одна ужасная ошибка Roslyn. Вы можете видеть это только, глядя на MSIL. Компилятор автоматически генерирует свойство Button1 в классе Main, у него есть массивная ошибка. Он использует MainBase1.Button1 вместо MainBase2.Button1. VS2015 Update 1 скоро появится, в настоящее время в RC. Он исправляет множество ошибок Roslyn, сначала попробуйте. Если они не исправили это, сообщите об ошибке [https://github.com/dotnet/roslyn/issues/new). –

+0

После обновления 1 этот вопрос все еще остается. Я сообщил об этом на [GitHub] (http://github.com/dotnet/roslyn/issues/7659). – VV5198722

+0

@ VV5198722 Я столкнулся с той же проблемой. Вы случайно нашли решение в то же время? – brovar

ответ

2

Эта ошибка по-прежнему сохраняется. Вот мое решение.

Я сделал обработчик в MainBase1Protected Overridable. Подклассы не используют Handles, но переопределяют обработчик и вызывают MyBase.

Этот подход имеет то преимущество, что порядок выполнения обработчиков четко определен.

Public Class MainBase1 
    Inherits Form 

    Protected WithEvents Button1 As Button 
    Protected TextBox1 As TextBox 

    Public Sub New() 
     SuspendLayout() 

     Text = "WithEvents Test" 
     ClientSize = New Size(300, 300) 

     Button1 = New Button() 
     Button1.Location = New Point(10, 10) 
     Button1.Size = New Size(100, 25) 
     Button1.Text = "Button1" 
     Controls.Add(Button1) 

     TextBox1 = New TextBox() 
     TextBox1.Location = New Point(10, 50) 
     TextBox1.Multiline = True 
     TextBox1.Size = New Size(280, 240) 
     Controls.Add(TextBox1) 

     ResumeLayout(False) 
     PerformLayout() 
    End Sub 

    Protected Overridable Sub Button1_Click(sender As Object, e As EventArgs) _ 
    Handles Button1.Click 
     TextBox1.Text &= "MainBase1: Button click handled." & vbNewLine 
    End Sub 
End Class 


Public Class MainBase2 
    Inherits MainBase1 

    Protected Overrides Sub Button1_Click(sender As Object, e As EventArgs) 
     MyBase.Button1_Click(sender, e) 
     TextBox1.Text &= "MainBase2: Button click handled." & vbNewLine 
    End Sub 
End Class 


Public Class Main 
    Inherits MainBase2 

    Protected Overrides Sub Button1_Click(sender As Object, e As EventArgs) 
     MyBase.Button1_Click(sender, e) 
     TextBox1.Text &= "Main: Button click handled." & vbNewLine 
    End Sub 
End Class 
+0

Я сделал то же самое. Надеялся, может быть, вы каким-то образом его обработали, не меняя код;) Спасибо за ваш ответ! – brovar

Смежные вопросы