当前位置: 代码迷 >> VB Dotnet >> 用户控件会自动生成事件方法的奇怪有关问题
  详细解决方案

用户控件会自动生成事件方法的奇怪有关问题

热度:174   发布时间:2016-04-25 02:01:20.0
用户控件会自动生成事件方法的奇怪问题
本帖最后由 hironpan 于 2015-06-13 14:24:04 编辑
在项目中添加一个用户控件“testUserControl”,并定义一个事件“TestEvent”

Public Class testUserControl
    ''' <summary>
    ''' 自定义事件。
    ''' </summary>
    ''' <param name="items">事件参数。</param>
    ''' <remarks></remarks>
    Public Event TestEvent(items As List(Of String))
End Class

重新生成项目,将用户控件“testUserControl”添加到窗体"Form1"中,然后编辑它的自定义事件过程

Public Class Form1
    Private Sub TestUserControl1_TestEvent(items As List(Of String)) Handles TestUserControl1.TestEvent
        ' 用户控件的自定义事件过程
    End Sub
End Class

切换至窗体设计界面,更改一下用户控件的属性(比如拖动控件到新的位置,使其Location属性改变)
然后重新生成项目,这时候就报错了,切换至窗体代码编辑窗口,就多出了一个事件过程



另外我发现,如果自定义的事件不含特殊的参数,在窗体代码中对应的事件过程名称改变之后,也会出现这种情况,但是不会报错



求教:
1、为什么事件参数类型 “List(Of String)” 会变成 “System.Collections.Generic.List`1”?我猜如果它不变,即使自动生成事件过程也不会报错了吧?
2、求解如何不让它自动生成事件过程?有没有解决每次调试报错的方法或替代方法?
3、为什么会自动多出来事件过程呢?这是超自然现象吗?

------解决思路----------------------
你的用户控件有问题,应该是重新创建了新控件造成的,而过程并不会同时删除。
------解决思路----------------------
因为泛型 List(of String) 不是一个有效的类名,真正的类名就是 List`1

然后很好玩的事情发生了:
IDE认为参数 List(of String) 不符合事件定义,自动新生成了一个;
结果编译器又认为 List`1 不是合法的语句。
互为错误

所以 .Net 中事件最好做成下面这样的形式,不仅IDE管理不会出错,还方便多个控件绑定同一个处理过程。
Public Event MyEvent(ByVal sender As Object, ByVal e As EventArgs)
  相关解决方案