Ajax ASP .Net Control Toolkit Accordion i nie działające eventy

Windows

Pisząc swoją pracę magisterską natknąłem się na bug (oczywiście nie jestem jedynym, który to odkrył) w zbiorze komponentów AJAX Control Toolkit. W wypadku gdy w umieścimy jakieś obiekty (najprostszy przykład to obiekt Button) posiadające eventy to niestety po kompilacji strony te eventy nie zostaną wykonane.
Podam przykład, który ułatwi zrozumienie. Oto kod przykładowej strony posiadającej Accordion z dwoma panelami, jeden z paneli posiada przycisk uruchamiający kod (czyli event), drugi zawiera tylko zwykły tekst. Kolorem wyróżniłem panel który będzie nas interesował.


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" %>
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">


Nagłówek testowy 1 A to jest testowa zawartość numer 1 OnClick="Button1_Click" Text="Button" /> Nagłówek testowy 2 A to natomiast jest testowa zawartość numer 2

W pierwszym panelu umieszczony jest przycisk do którego podpięty jest kod zmieniający zawartość tekstową obiektu Label. Bardzo prosty kod. Wklejam tutaj całość pliku, kolorem zaznaczam interesujący nas kod eventu podpiętego do przycisku.


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "Panel odświeżony o " + DateTime.Now.ToString();
}
}

Wszystko wygląda w porządku i jest poprawnie napisane, gdyby identyczne obiekty znajdowały się poza panelem Accordionu nie byłoby żadnych problemów. Aby to zadziałało potrzebna jest malutka sztuczka. Należy dodać do funkcji Page_Init() kod, który programowo doda do panelu Accordiona (oczywiście tego w którym posiadamy obiekty z nie uruchamiającymi się eventami) obiekt HiddenField. Dziwne. Ja nie widzę związku pomiędzy tym a działaniem eventów. To jest jednak nieważne , liczy się efekt ponieważ po dokonaniu tego wszystko działa bez zarzutu.

A więc jeśli jeszcze nie posiadamy tworzymy funkcję Page_Init().


void Page_Init()
{
}

Musimy teraz dostać się do kolekcji paneli Accordion. Robimy to w ten sposób:


void Page_Init()
{
AjaxControlToolkit.AccordionPane pane1 = Moje.Panes[0];
}

Następnym krokiem jest stworzenie obiektu HiddenField oraz dodanie go do istniejącego panelu.


void Page_Init()
{
AjaxControlToolkit.AccordionPane pane1 = Moje.Panes[0];

HiddenField hfield = new HiddenField();
pane1.ContentContainer.Controls.Add(hfield);
}

Po tym zabiegu działa bez zarzutu. Od kilku dni dostępna jest nowa wersja AJAX Control Toolkit ale w changelogu nie zauważyłem poprawki tego błędu, może przeoczyłem to. W każdym razie rozwiązanie jest…i jest proste.

Pełny kod do artykułu można pobrać tutaj.

Dziękuje.

Podziel się:
  • Digg
  • del.icio.us
  • Gwar
  • OSnews.pl
  • Reddit
  • Technorati
  • Wykop
  • Facebook
  • Google Bookmarks
  • Live
  • Ma.gnolia
  • Slashdot
  • SphereIt
  • StumbleUpon
  • De.lirio.us
  • laaik.it
  • email
  • LinkedIn
  • MySpace
  • NewsVine
  • Yahoo! Buzz
No Comments

Leave a Reply

Allowed tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

CommentLuv Enabled