2009-04-09 9 views
6

J'ai créé un contrôle utilisateur simple en utilisant l'AJAX Control Toolkit Accordéon, LinkButton et TextBox comme ceci:événement de commande LinkButton semble pas tirer

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> 

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

le gestionnaire d'événements LinkButton_Command ne se déclenche pas du tout le premier clic, mais sur la seconde. Y a-t-il un problème avec le lieu de création des contrôles qui provoque le blocage des événements?

Mise à jour: J'ajoute le contrôle statique:

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

Ajoutez-vous dynamiquement votre contrôle utilisateur à la page? – womp

+0

Je ne pense pas - c'est juste un contrôle d'utilisateur Web dans un projet de site Web, et je l'exécute sous le débogueur, et j'ai laissé tomber le contrôle directement sur une page. –

+0

Doutez, c'est ça, mais avez-vous besoin d'un ID sur le bouton de lien? – madcolor

Répondre

3

est ici une solution. J'ai vérifié dans un projet de test, et cela fonctionne:

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

Il semble que Databinding l'accordéon a quelques problèmes que gâcher vos gestionnaires d'événements être branché. Le relier à chaque fois les nukes d'une manière ou d'une autre.

En outre, votre code posté a un DataBind() appelé dans la méthode LinkButton_Command, qui se produit après que viewstate a été chargé. Cela conduirait à ce que les données mises à jour ne soient pas affichées avant la publication suivante, car les nouvelles liaisons ne seraient pas enregistrées dans ViewState. Il agirait comme si c'était toujours une postback derrière.

Questions connexes