c# - 在 Visual Studio 中自动创建处理程序签名

标签 c# events delegates

在 c#、asp.net 4.0、VS2015 中工作,我创建了一个用户控件,它只是一个下拉列表,其中包含用户可以传递给它的几个其他属性,以及一个事件和委托(delegate)。当下拉列表更改时,将触发 OnSelectedIndexChanged,然后检查事件是否已填充并调用委托(delegate)。

定义如下:

public partial class SiteList : System.Web.UI.UserControl
{
    public event SiteIDChangedHandler SiteIDChanged;
    public delegate void SiteIDChangedHandler(object sender, EventArgs e);
}

我遇到的问题是,当使用该用户控件并附加事件时,在 .aspx 页面中工作时,不会在 Visual Studio 中创建委托(delegate)的定义。例如,当我输入以下内容时

<CW:SiteList runat="server" ID="SiteList" OnSiteIDChanged=""

然后点击 OnSiteIDChanged 的​​ = 号,然后它会显示“创建新事件”作为 OnSiteIDChanged 的​​一个选项,就像我在 .net 中使用的任何其他事件一样。当我选择“CreateNewEvent”时,在后面的代码中创建的方法是:

 protected void SiteList_SiteIDChanged()
    {
    }

并且不包含处理程序的正确签名。

现在奇怪的是,如果我在后面的代码中用这个绑定(bind)事件: SiteList.SiteIDChanged +=

它说“按(TAB)插入”,插入的方法是:

private void SiteList_SiteIDChanged1(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }

那么我缺少什么,以便使用发送者创建正确的方法签名并在第一个实例中自动生成 eventargs?我知道这是可以做到的,所有的 .net 控件都可以做到!

最佳答案

我能够使用与您在 visual studio 中的控件相同的名称来实现它。

这是我的控制代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.UI;

namespace TestWebFormsAutoComplete
{
    public class SiteList : System.Web.UI.UserControl, IPostBackEventHandler
    {
        public event EventHandler<EventArgs> SiteIDChanged;

        public void RaisePostBackEvent(string eventArgument)
        {
            int i = 0;
        }

        protected virtual void OnSiteIDChanged(object sender, EventArgs e)
        {
            if (SiteIDChanged != null)
                SiteIDChanged(sender, e);
        }
    }
}

这是我的 web.config 控制/命名空间条目:

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2">
      <assemblies>
        <add assembly="TestWebFormsAutoComplete"/>
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.5.2" />      
    <pages>
      <controls>
        <add tagPrefix="test" namespace="TestWebFormsAutoComplete" assembly="TestWebFormsAutoComplete"/>
      </controls>
      <namespaces>
        <add namespace="TestWebFormsAutoComplete"/>
      </namespaces>
    </pages>
  </system.web>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
        type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>
</configuration>

这是我的测试 aspx 页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="TestWebFormsAutoComplete._default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        Test Site List <test:SiteList OnSiteIDChanged="Unnamed_SiteIDChanged" />
    </div>
    </form>
</body>
</html>

在我的测试中,当我填写 SiteList OnSiteIDChanged 事件时,我得到了一个选项“创建新事件”,我选择了它,它为我创建了这个,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TestWebFormsAutoComplete
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Unnamed_SiteIDChanged(object sender, EventArgs e)
        {

        }
    }
}

请注意,我的用户控件没有基于 ASCX 的前端,它仅在代码中。所以我没有使用带有 src 属性的标签前缀。我怀疑这就是它对您不起作用的原因。

虽然这似乎适用于基于代码的控件,但我认为它不适用于基于源代码的 ASCX 用户控件。

但是,您仍然可以创建没有 ASCX 前端的用户控件。您可以使用“Page.LoadControl”等从其他地方将 src 标记加载到您的控件中。

关于c# - 在 Visual Studio 中自动创建处理程序签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077865/

相关文章:

java - 按钮持续显示按下状态,无法显示结果

asp.net - 将 Javascript 与 ASP.Net 控件结合使用

c# - 如何创建通用委托(delegate)实例列表?

C# 通过 Delegate.CreateDelegate 使用具有值类型的属性

c# - 如何从单独的运行进程中捕获表单事件

c# - 如何将 Type 参数限制为仅某个接口(interface)

javascript - 使用 Javascript 将 mousemove 监听器添加到视频元素的控件

ios - 使用不同类型覆盖属性

c# - 如何以通用方式对 KeyValuePair 进行操作?

c# - PACT .NET 消费者测试 : flexible length array