2016-11-10 25 views
2

私は比較的新しいASP.NETで、カスタムユーザーコントロールを作成できませんでした。私はテキストボックスとイメージボタンを作成しようとしています。画像ボタンをクリックすると、GridViewが選択するさまざまな選択肢がポップアップ表示されます。私はすべてを洗練されていませんが、私が問題を抱えている私の問題は、私のimageButton onClickイベントが発生しないということです。 onClickコマンドでブレークポイントを実行していますが、起動することはありません。カスタムユーザーコントロールでイベントが発生しない

多くのフォーラムを確認しましたが、問題を解決した情報が見つかりませんでした。私は、それを実行しているWebフォームだけでなく、ユーザーコントロールのコードも含めています。質問に混乱を招いて申し訳ありません。情報へのアドバイスやご指摘ありがとうございます。あなたがGoogleにすべき話題があると思うなら、私に知らせることを恐れないでください。また、醜いコードには申し訳ありません(私は得ることができるすべての基本的なコーディングのアドバイスを取る)。 BTW私は、updatepanel/scriptmanager用のAJAXツールキットをインポートしました。前もって感謝します。 ASPX --test

--customコントロールASCX

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" Inherits="CustomCntrl.WebUserControl1" ClassName="WebUserControl1" EnableViewState="true"%> 

    <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
<asp:UpdatePanel runat="server" RenderMode="Inline" ID="UpdatePanel1"> 
    <ContentTemplate> 
     <asp:TextBox ID="txtOutput" runat="server"></asp:TextBox> 
    </ContentTemplate> 
</asp:UpdatePanel> 

<asp:ImageButton ID="IBtnLkUp" CausesValidation="false" runat="server" ImageUrl="~/Images/Lookup.png" OnClick="IBtnLkUp_Click" OnCommand="IBtnLkUp_Command" /> 

<ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="IBtnLkUp" PopupControlID="Panel1" CancelControlID="btnCancel" DropShadow="true"></ajaxToolkit:ModalPopupExtender> 

<asp:Panel ID="Panel1" runat="server">  
    <asp:GridView runat="server" ID="gvSrch" OnRowCancelingEdit="gvSrch_RowCancelingEdit" OnRowDeleting="gvSrch_RowDeleting" OnRowUpdating="gvSrch_RowUpdating" OnSelectedIndexChanging="gvSrch_SelectedIndexChanging"></asp:GridView> 
     <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox> 
     <asp:Button ID="btnSearch" runat="server" Text="Search" /> 
     <asp:Button ID="btnCancel" runat="server" Text="Cancel" /> 

</asp:Panel> 

--customコントロールASCX.cs--

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

namespace CustomCntrl 
{  
    public partial class WebUserControl1 : System.Web.UI.UserControl 
    { 
     public event EventHandler evLookupBtn; 
     public event EventHandler evSelectBtn; 
     public event EventHandler evDeleteBtn; 
     public event EventHandler evEditBtn; 
     public string sImgBtnUrl { get; set; } 
     public DataTable dtLookup { get; set; } 
     public bool bSelectBtn { get; set; } 
     public bool bEditBtn { get; set; } 
     public bool bDeleteBtn { get; set; } 
     public bool bPaging { get; set; } 
     public int pagesize { get; set; } 

     protected void OnPreInit() { 
      //IBtnLkUp.Click += IBtnLkUp_Click; 
      //ImageButton ib = (ImageButton)IBtnLkUp; 
      //ib.Click += new EventHandler(IBtnLkUp_Click(this.IBtnLkUp, ImageClickEventArgs.Empty)); 
      Panel1.Controls.Add(IBtnLkUp); 
     } 
     /* public event ImageClickEventHandler IBtnLkUp_Click{ 
      add { IBtnLkUp.Click += value; } 
      remove { IBtnLkUp.Click -= value; } 
     }*/ 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      //IBtnLkUp.Click += IBtnLkUp_Click; 

      IBtnLkUp.ImageUrl = sImgBtnUrl; 
     } 

     protected void IBtnLkUp_Click(object sender, ImageClickEventArgs e) 
     {    
      //Panel1.Visible = true; 
      //UpdatePanel1.Visible = true; 
      //gvSrch.Visible = true; 
      gvSrch.Visible = true; 
      //UpdatePanel1.Visible = true; 
      Panel1.Visible = true; 

      gvSrch.AutoGenerateSelectButton = bSelectBtn; 
      gvSrch.AutoGenerateEditButton = bEditBtn; 
      gvSrch.AutoGenerateDeleteButton = bDeleteBtn; 
      if (bPaging == true) 
      { 
       gvSrch.AllowPaging = bPaging; 
       gvSrch.PageSize = pagesize; 
      } 
      else gvSrch.AllowPaging = false; 

      gvSrch.DataSource = dtLookup; 
      gvSrch.DataBind(); 
      if(evLookupBtn !=null) 
      evLookupBtn(this, EventArgs.Empty); 
      //Panel1.Visible = true; 
      //UpdatePanel1.Visible = true; 
      //gvSrch.Visible = true; 
     } 

     protected void gvSrch_SelectedIndexChanging(object sender, GridViewSelectEventArgs e) 
     { 
      evSelectBtn(this, EventArgs.Empty); 
     } 

     protected void gvSrch_RowUpdating(object sender, GridViewUpdateEventArgs e) 
     { 
      evEditBtn(this, EventArgs.Empty); 
     } 

     protected void gvSrch_RowDeleting(object sender, GridViewDeleteEventArgs e) 
     { 
      evDeleteBtn(this, EventArgs.Empty); 
     } 

     protected void gvSrch_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) 
     { 
      e.Cancel = true; 
      gvSrch.EditIndex = -1; 
      gvSrch.DataBind();//rebind data? 
     } 

     /* protected void IBtnLkUp_Click1(object sender, ImageClickEventArgs e) 
     {     
      //Panel1.Visible = true; 
      //UpdatePanel1.Visible = true; 
      //gvSrch.Visible = true; 
      gvSrch.Visible = true; 
      //UpdatePanel1.Visible = true; 
      Panel1.Visible = true;  

      gvSrch.AutoGenerateSelectButton = bSelectBtn; 
      gvSrch.AutoGenerateEditButton = bEditBtn; 
      gvSrch.AutoGenerateDeleteButton = bDeleteBtn; 
      if (bPaging == true) 
      { 
       gvSrch.AllowPaging = bPaging; 
       gvSrch.PageSize = pagesize; 
      } 
      else gvSrch.AllowPaging = false; 

      gvSrch.DataSource = dtLookup; 
      gvSrch.DataBind(); 
      if (evLookupBtn != null) 
       evLookupBtn(this, EventArgs.Empty); 
      //Panel1.Visible = true; 
      //UpdatePanel1.Visible = true; 
      //gvSrch.Visible = true; 
     } 
    */ 
     protected void IBtnLkUp_Command(object sender, CommandEventArgs e) 
     { 

     } 
    } 
} 

--Test.aspx--

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="CustomCntrl.WebForm1"enableviewstate="true" %> 

<%@ Register Src="~/UserControls/WebUserControl1.ascx" TagPrefix="uc1" TagName="WebUserControl1" %> 

<!DOCTYPE html> 

    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
     <title runat="server"></title> 
    </head> 
    <body> 
     <form id="form1" runat="server"> 
     <div> 
      <uc1:WebUserControl1 runat="server" ID="WebUserControl1" sImgBtnUrl="~/Images/Lookup.png" bDeleteBtn="false" bEditBtn="false" bSelectBtn="true" bPaging="false"/> 
     </div> 
      <asp:Label ID="LabelTest" runat="server" Text=""></asp:Label> 
     </form> 
    </body> 
    </html> 

.CS--

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

namespace CustomCntrl 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void WebUserControl1_evSelectBtn(object sender,EventArgs e) { 
      LabelTest.Text = "Success"; 
     } 
     protected void Page_Load(object sender, EventArgs e) 
     { 
       DataTable dt = new DataTable(); 
       dt.Clear(); 
       dt.Columns.Add("Name"); 
       dt.Columns.Add("Marks"); 
       DataRow dr = dt.NewRow(); 
       dr[0] = "Smith"; 
       dr[1] = "1"; 
       dt.Rows.Add(dr);    

       WebUserControl1.dtLookup = dt;     
     }  
    } 
} 

答えて

0

UserControlから親ページにコマンドを送信したいようです。その場合は、EventHandlerの代わりにDelegateを使用する必要があります。

は親ページで

//declare the delegates 
private Delegate _sendCommandToParentControl; 
public Delegate sendCommandToParentControl 
{ 
    set { _sendCommandToParentControl = value; } 
} 

//just a button click event handler 
protected void sendCommandToParentControl_Click(object sender, EventArgs e) 
{ 
    //send the textbox value to the parent by invoking the delegated command 
    _sendCommandToParentControl.DynamicInvoke(TextBox1.Text); 
} 

し、ユーザーコントロールに

delegate void commandFromChildControlDelegate(string value); 

protected void Page_Load(object sender, EventArgs e) 
{ 
    //add the command to the usercontrol 
    commandFromChildControlDelegate command = new commandFromChildControlDelegate(processCommandFromChildControl); 
    WebUserControl1.sendCommandToParentControl = command; 
} 

//the command invoked from the child control 
private void processCommandFromChildControl(string value) 
{ 
    Label1.Text = value; 
} 
+0

おかげで多くのことをこれを追加します。私はデリゲートについてのいくつかの.Net記事を読んでいますが、それについては私の頭を包み込むことができませんでした。私はそれらを理解するために彼らと一緒に遊ぶ必要があるようです。デリゲートがイベントを保存し、そのイベントを親ページに送信するようです。親ページは、そのコマンドに反応します。もう一度ありがとう、私は明日仕事に戻るときにこれを試してみる必要があります。 – wsbobbitt

+0

今日これを実装しようとしました。これは正しいことだと思う。私は代議員を読んで、いくつかのビデオを見てきました。それでもアイロンで物事を取り戻すことはできませんでした。私のユーザコントロールのデリゲートにイベントハンドラを指す必要があるようです。私は月曜日にそれをもう少し詳しく見ていきます。私が学んだすべてのコーディングコンセプトの中で、代議員はより抽象的な/よりコンセプトを学ぶのが難しいようです。 – wsbobbitt

+0

私は最終的に私の解決策を終えました。私はイベントのどれも私の親ページに渡さなかった。私は、コントロール内のすべてのイベントを処理するソリューションを書き直しました。代理人はこの2番目の権利を扱うにはあまりにも多くのことを証明しました。誰かが代議員の良い記事を推薦すれば、私に知らせてください。 – wsbobbitt

関連する問題