Lar*_*Bud 5 c# events delegates
在 c#、asp.net 4.0、VS2015 中,我创建了一个用户控件,它只是一个下拉列表,其中包含一些用户可以传递给它的其他属性,以及一个事件和委托。当下拉列表更改时,将触发 OnSelectedIndexChanged,然后检查事件是否已填充并调用委托。
定义如下所示:
public partial class SiteList : System.Web.UI.UserControl
{
public event SiteIDChangedHandler SiteIDChanged;
public delegate void SiteIDChangedHandler(object sender, EventArgs e);
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当使用该用户控件并附加事件时,在 .aspx 页面中工作时,不会在 Visual Studio 中创建委托的定义。例如,当我输入以下内容时
<CW:SiteList runat="server" ID="SiteList" OnSiteIDChanged=""
Run Code Online (Sandbox Code Playgroud)
并点击 OnSiteIDChanged 的 = 符号,然后它说“创建新事件”作为 OnSiteIDChanged 的选项,就像我在 .net 中使用的任何其他事件一样。当我选择“CreateNewEvent”时,在后面的代码中创建的方法是:
protected void SiteList_SiteIDChanged()
{
}
Run Code Online (Sandbox Code Playgroud)
并且不包含处理程序的正确签名。
现在奇怪的是,如果我在后面的代码中绑定事件: SiteList.SiteIDChanged +=
它说“按(TAB)插入”,插入的方法是:
private void SiteList_SiteIDChanged1(object sender, EventArgs e)
{
throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)
那么我错过了什么,以便使用发送者创建正确的方法签名,并且 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 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=\"Web\" /optionInfer+"/>
</compilers>
</system.codedom>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这是我的测试 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>
Run Code Online (Sandbox Code Playgroud)
在我的测试中,当我填写 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)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我没有用于用户控件的基于 ASCX 的前端,它仅包含代码。所以我没有使用带有 src 属性的标签前缀。我怀疑这就是它对你不起作用的原因。
虽然这似乎适用于基于代码的控件,但我认为它不适用于基于源的 ASCX 用户控件。
但是,您仍然可以制作没有 ASCX 前端的 UserControl。您可以使用“Page.LoadControl”等从其他地方将 src 标记加载到您的控件中。