2009-04-09 13 views
6

を発射されていないようだ。のLinkBut​​tonコマンドイベントは、私はこのようなAJAXコントロールツールキットアコーディオン、LinkBut​​tonコントロール、およびテキストボックスを使用して、簡単なユーザーコントロールを作成し

TestControl.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="TestControl.ascx.cs" Inherits="TestControl" %> 
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %> 
<cc1:Accordion ID="Accordion1" runat="server"> 
    <Panes></Panes> 
    <HeaderTemplate> 
     <div><%# Container.DataItem %></div> 
    </HeaderTemplate> 
    <ContentTemplate> 
     <div> 
      <asp:TextBox ID="textBox" Text='<%# Container.DataItem %>' runat="server"></asp:TextBox> 
      <asp:LinkButton Text="Update" CommandName="Update" CommandArgument='<%# Container.DataItem %>' OnCommand="LinkButton_Command" runat="server"></asp:LinkButton> 
     </div> 
    </ContentTemplate> 
</cc1:Accordion> 

とTestControl.ascx .cx:

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

public partial class TestControl : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Accordion1.DataSource = new string[] { "one", "two", "three" }; 
     Accordion1.DataBind(); 
    } 

    protected void LinkButton_Command(object sender, CommandEventArgs e) 
    { 
     if (e.CommandName == "Update") 
     { 
      TextBox value = ((LinkButton)sender).Parent.FindControl("textBox") as TextBox; 
      ((string[])Accordion1.DataSource)[Accordion1.SelectedIndex] = value.Text; 
      Accordion1.DataBind(); 
     } 
    } 
} 

LinkBut​​ton_Commandイベントハンドラは、最初のクリックで、2番目には全く発生しません。イベントが正しく接続されない原因となるコントロールが作成されているライフサイクルのどこに問題がありますか?

アップデート:私は、静的コントロールを追加している:ここで

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<%@ Register src="TestControl.ascx" tagname="TestControl" tagprefix="uc2" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 

    <form id="form1" runat="server">  
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <div border="1"> 
     <uc2:TestControl ID="TestControl1" runat="server" /> 
    </div> 



    </form> 
</body> 
</html> 
+0

ユーザーコントロールをページに動的に追加していますか? – womp

+0

私はそうは思わない - これはウェブサイトのプロジェクトのウェブユーザーコントロールであり、私はデバッガの下でそれを実行しており、コントロールをページに直接ドロップした。 –

+0

これは間違いですが、リンクボタンにIDが必要ですか? – madcolor

答えて

3

はソリューションです。私はテストプロジェクトでこれをチェックアウトし、これは動作します:

ASCX:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestControl.ascx.cs" Inherits="WebApplication1.TestControl" %> 
<%@ Import Namespace="System.ComponentModel"%> 
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %> 

<cc1:Accordion ID="Accordion1" runat="server" Enabled="True"> 

    <Panes></Panes> 
    <HeaderTemplate> 
     <div><asp:Label runat="server" ID="HeaderLabel"><%# Container.DataItem %></asp:Label></div> 
    </HeaderTemplate> 
    <ContentTemplate> 
     <div> 
      <asp:TextBox ID="textBox" Text='<%# Container.DataItem %>' runat="server"></asp:TextBox> 
      <asp:LinkButton ID="LinkButton1" Text="Update" CommandName="Update" CommandArgument='<%# Container.DataItem %>' 
      OnCommand="LinkButton_Command" runat="server"></asp:LinkButton> 
     </div> 
    </ContentTemplate> 

</cc1:Accordion> 

分離コード:

public partial class TestControl : System.Web.UI.UserControl 
{ 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      Accordion1.DataSource = new string[] {"one", "two", "three"}; 
      Accordion1.DataBind(); 
     } 
    } 

    protected void LinkButton_Command(object sender, CommandEventArgs e) 
    { 
     if (e.CommandName == "Update") 
     { 
      TextBox value = ((LinkButton)sender).Parent.FindControl("textBox") as TextBox; 
      (Accordion1.Panes[Accordion1.SelectedIndex].Controls[0].Controls[1] as Label).Text = value.Text; 
     } 
    } 
} 

アコーディオンをデータバインディングすると、いくつかの問題を持っているように見えること台無しあなたのイベントハンドラを有線になっています。それをどうにかして核付ける。

また、あなたの投稿コードには、LinkBut​​ton_Commandメソッドで呼び出されたDataBind()があります。これは、viewstateがロードされた後に発生しています。これにより、新しいバインディングがViewStateに保存されないため、更新されたデータが次のポストバックまで表示されなくなります。常に1つのポストバックのように行動するでしょう。

関連する問題