2011-09-14 14 views
7

Mam problem, w wyniku którego stan widoku repeatera, tj. Elementy sterujące wewnątrz repeatera, nie zachowują stanu wyświetlania.Utrzymywanie stanu widoku repetera

mam następujące:

Repeater 1:

<asp:Repeater ID="rptImages" runat="server"> 
<ItemTemplate> 
    <asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" /> 
</ItemTemplate> 
</asp:Repeater> 

Gdy przycisk kliknięciu łącza wartość CommandArgument są przechowywane w ukrytym polem na stronie.

Po odświeżeniu strony nie można uzyskać wartości ukrytego pola do momentu załadowania programu obsługi zdarzeń wstępnych. Więc w moim przypadku prerender łapię wartość pola ukrytego i przechowywać go w nieruchomości listy, tak jak poniżej:

if (!string.IsNullOrEmpty(this.SelectedImageIDsInput.Text)) { 
     this.ImageList.Add(this.SelectedImageIDsInput.Text); 
    } 

a właściwość Lista wygląda tak:

public List<string> ImageList { 
    get { 
     if (this.ViewState["ImageList"] == null) { 
      this.ViewState["ImageList"] = new List<string>(); 
     } 
     return (List<string>)(this.ViewState["ImageList"]); 
    } 
    set { this.ViewState["ImageString"] = value; } 
} 

Raz mam zapisane wartość do mojej własności listy wiążę moją drugą repeater (ponownie w razie prerender):

this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList; 
this.rptSelectedImages.DataBind(); 

drugi repeater ma dropdownlist i pole tekstowe w nim. Problem polega na tym, że stan wyświetlania tych kontrolek podrzędnych nie jest zachowywany. Zakładam, że tak jest, ponieważ przy każdym odświeżeniu zwrotnym ponownie wiążę repeater, dlatego jest on przebudowywany. Co nie wiem, jak mogę to obejść? Właściwość ImageList jest aktualizowana tylko w przypadku odświeżenia strony, więc oczywiście muszę ponownie powiązać repeatera z każdym powiadomieniem zwrotnym - jak inaczej można to zrobić?

Każda pomoc zostanie bardzo doceniona.

Dzięki Al

Odpowiedz

13

Jeśli ponowna konsolidacja repeater, trzeba to zrobić na Init przed ViewState jest załadowany.

Powinieneś również sprawdzić flagę IsPostback i powiąż z nią repeater, gdy strona nie jest odsyłana z powrotem.

celu wyjaśnienia, czy drugi repeater jest zobowiązany na PreRender następnie ViewState nie mogą być wykorzystywane do utrwalania kontroli, bo po prostu nie istnieje, gdy ViewState jest załadowany - po Init i przed PreLoad.

Konieczne jest kontynuowanie wiązania w każdym odświeżeniu, przechowywanie lub lista w Session, aby mieć dostęp do listy do wiązania raz na Init, (lub po zmianie).

+0

Hi CodeKing. Jednak są tam dwa problemy - nie mogę uzyskać wartości ukrytego pola już w momencie uruchomienia Init - a właściwość ImageList można aktualizować tylko po odesłaniu ..... – higgsy

+0

W takim przypadku konieczne będzie ponowne powiązanie drugiego przemiennika przy każdym połączeniu używającym wartości w ukrytym polu. – TheCodeKing

+0

Hi CodeKing - to dokładnie to, co robię, ale nie jest to? Czy nie rozumiem twojej odpowiedzi. Obecnie czekam, aż onprerender dostanie wartość ukrytego pola, a następnie ponownie zwiąże repeatera - problem z tym jest stanem wyświetlania kontrolek w repeaterie, nie utrzymuj się na postbacks .... – higgsy

0

Nie widzę powodu, aby kopiować właściwość CommandArgument do ukrytego pola. Powinieneś użyć zdarzenia ItemCommand na Repeater i użyć bulgotania zdarzeń. można obsługiwać zdarzenie Click na LinkButton Ci tak:

repeater.ItemCommand += (sender, eventArgs) => { 
    var commandArgument = eventArgs.CommandArguments; 
    ImageList.Add(commandArgument); 
    rptSelectedImages.DataSource = ImageList; 
    rptSelectedImages.DataBind(); 
} 
+0

Cześć Mikael - Wiem, że wydaje się to szalone, aby skopiować je na ukryte pole. Problem polega na tym, że mam również przesyłanie obrazu jQuery na tej samej stronie - po przesłaniu pliku handler zwraca nowy ImageId - oczywiście JS nie może wywołać ImageList.Add, więc musi być przechowywany w ukrytym polu. Czy to ma sens? – higgsy

Powiązane problemy