2016-05-06 4 views
1

C#、asp.net 4.0、VS2015で作業しています。ユーザーコントロールを作成しました。このコントロールは、ユーザーが渡すことができる他のプロパティもいくつかありますイベントとデリゲートとして。ドロップダウンが変更されると、OnSelectedIndexChangedがトリガされ、イベントがポピュレートされてデリゲートを呼び出すかどうかがチェックされます。このようなVisual Studioでハンドラシグネチャを自動的に作成する

定義ルック:

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

私がいる問題は、そのユーザーコントロールが消費されている場合で、イベントが動作したときに、デリゲートの定義がVisual Studioで作成されていない取り付けられています。 .aspxページ。たとえば、私は、次の

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

を入力してOnSiteIDChangedのための=記号を打っていて、それは、ちょうど私が.NETで使用していた他のイベントと同様に、OnSiteIDChangedのオプションとして、「新規イベントを作成」と言います。 "CreateNewEvent"を選択した場合、コードの背後に作成されるメソッドは、

protected void SiteList_SiteIDChanged() 
    { 
    } 

であり、ハンドラの適切な署名が含まれていません。私はこれと後ろのコードでイベントをバインドする場合

今すぐ奇妙だものです: =

+ SiteList.SiteIDChangedそれは「挿入するように押して(TAB)」と言うと、挿入されている方法は次のとおりです。

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

送信者に適切なメソッドシグネチャが作成され、最初のインスタンスにeventargsが自動的に追加されるように、私は何が欠けていますか?私はそれができることを知っている、すべてのネットコントロールはそれを行う!

+0

自分で作成するのではなく、組み込みの 'EventHandler'デリゲートを使うべきです。 – SLaks

+0

ASPX WebフォームはWin Formsデザイナーのように機能しません。できません。 代わりにサーバー側でOnInit Overrideを実行します。 SiteList.SiteIDChange + =(タブは自動完成のためにここにあります)。 新しい開発者にはWebフォームを使用しない人が多いことに気づくほど価値があります。MVC 5+とWeb API 2を使う方がずっといいです。 –

+0

Webフォームではこのように機能します。先に進んでasp:dropdownlistを作成してみてください。できます。私たちの組織全体はウェブフォームです。 – LarryBud

答えて

0

私はこれをビジュアルスタジオであなたのコントロールと同じ名前を使って動作させることができました。

ここに私のコントロールコードがあります。ここで

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> 

、私が記入したサイトリスト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フロントエンドを使用せずにUserControlを作成することはできます。 "Page.LoadControl"などを使用して、他の場所からコントロールにsrcマークアップを読み込むことができます。

+0

また、開発中の同じWebサイトにコントロールを書き込むときに、ビジュアルスタジオでのキャッシュ問題に頻繁に遭遇することがあり、清潔で再構築しなければならないことがあります。変更を参照してください。 –

+0

ASCXのコードは「ソースベース」ではないため、他のクラスファイルと同様に、最後のステートメントは理解しています。 – LarryBud

+0

デフォルトテンプレートを使用している場合、ASCXユーザーコントロールにはフロントエンドマークアップがあります。コードはコンパイルされていますが、フロントエンドのASCXマークアップでは子コントロールを取得できません。 UserControlから継承した100%コードベースのc#クラスを作成できますが、ASPXエンジンまたはPage.LoadControlを使用してレンダリングされるASCXマークアップフロントエンドを持つこともできます。 –

関連する問題