2009-04-09 15 views
6

ho creato un controllo semplice utente che utilizza AJAX Control Toolkit Fisarmonica, LinkButton, e TextBox in questo modo:evento di comando LinkButton sembra non essere sparare

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> 

E 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(); 
     } 
    } 
} 

il gestore di eventi LinkButton_Command non si attiva in tutte al primo scatto, ma sul secondo. C'è un problema con dove viene creato il ciclo di vita dei controlli che fa sì che gli eventi non vengano collegati correttamente?

Update: Sto aggiungendo il controllo statico:

<%@ 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

Stai aggiungendo il controllo utente in modo dinamico alla pagina? – womp

+0

Io non la penso così - questo è solo un controllo utente web in un progetto di sito Web, e lo sto eseguendo sotto il debugger, e ho lasciato cadere il controllo direttamente su una pagina. –

+0

Dubbio, ma è necessario un ID sul pulsante di collegamento? – madcolor

risposta

3

Ecco una soluzione. Ho controllato questo fuori in un progetto di test, e questo funziona:

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> 

Codebehind:

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; 
     } 
    } 
} 

Sembra che l'associazione dati della fisarmonica ha alcuni problemi che rovinare i vostri gestori di eventi essere collegato. Ri-legarlo ogni volta che li colpisce in qualche modo.

Inoltre, il codice inviato ha un DataBind() chiamato nel metodo LinkButton_Command, che si verifica dopo che è stato caricato viewstate. Ciò porterebbe a non mostrare i dati aggiornati fino al prossimo postback, poiché i nuovi collegamenti non verrebbero salvati in ViewState. Agirebbe come se fosse sempre un postback dietro.

Problemi correlati