ASP .NET Web Forms, GridView i niedziałające zdarzenie

Odpowiedz Nowy wątek
2014-04-18 19:39
0

Witam

Za żadne skarby nie mogę poradzić sobie z jedną zupełnie niezrozumiałą dla mnie rzeczą.
Mam GridView, mam w nim kilka LinkButtonów, do nich mam przypisaną metodę zdarzeniową select. Chodzi o to, że po kliknięciu w danego linkbuttona, pojawiają się imagebuttony, następnie po kliknięciu na imagebutton ma uruchamiać się metoda zdarzeniowa (a nie uruchamia).
Zdjęcia którę są pokazywane są z określonego folderu znajdującego się w folderze Uploads. Wygląda to tak:


protected void Select(object sender, EventArgs e)
        {
 foreach (string strfile in System.IO.Directory.GetFiles(Server.MapPath("~/Uploads/" + (sender as LinkButton).CommandArgument)))
            {
                ImageButton imageButton = new ImageButton();
                System.IO.FileInfo fi = new System.IO.FileInfo(strfile);
                imageButton.ImageUrl = "~/Uploads/" + (sender as LinkButton).CommandArgument + "/" + fi.Name;
                imageButton.Width = Unit.Pixel(50);
                imageButton.Height = Unit.Pixel(50);
                imageButton.Style.Add("padding", "5px");
                imageButton.Click += new ImageClickEventHandler(imageButton_Click);
                Panel1.Controls.Add(imageButton);
                list.Add(imageButton);

            }
}

metoda zdarzeniowa:


 public void imageButton_Click(object sender, ImageClickEventArgs e)
        {

            Response.Redirect("WebForm2.aspx?ImageURL=" +
            ((ImageButton)sender).ImageUrl);

        }

Jeśli wnętrze metody Select a przede wszystkim kod:


                imageButton.Click += new ImageClickEventHandler(imageButton_Click);

będzie zawarty w Page_Load, oczywiście bez

(sender as LinkButton).CommandArgument 

tylko z jakąś nazwą prawdziwą folderu, to wszystko działa.
Nie rozumiem, przy innych aplikacjach nie natknąłem się na to, aby coś takiego:

                 imageButton.Click += new ImageClickEventHandler(imageButton_Click);

musiało być tylko w Page_Load. Oczywiście przez to, że działa to tylko w Page_Load, nie mogę (chyba, że mogę ale tego nie widzę?) przypisać

 sender as LinkButton 

a wiec nie moge tego tak oprogramowac, zeby wyswietlilo sie zawartosc tego folderu, zaleznie w ktory linkButton kliknę.
Jak sobie z tym poradzić?

edytowany 4x, ostatnio: rafaltheo, 2014-04-18 19:43

Pozostało 580 znaków

2014-04-29 00:54
ANDRZEJJEZRDNA
0

Z tego co widzę, wrzucasz referencje tych przycisków do jakieś listy (list.Add(imageButton)). Zrób w PageLoad foreach na tą listę i jeszcze raz przypisz funkcję do zdarzenia kliknięcia. Jeżeli po PostBacku nie masz nic na liście to zapisz ją do zmiennej sesyjnej. Taki pomysł przychodzi mi na szybko do głowy. Nie jest zbyt elegancki, ale może zadziałać.

Pozostało 580 znaków

2014-04-29 10:59
Luque
1

Twój kod nie ma prawa działać. Zabierasz się za tworzenie aplikacji w ASP.NET Web Forms bez pojęcia o fundamentalnej rzeczy w tej technologii czyli cyklu życia strony ASPX-owej w ramach żądania HTTP. Zapoznaj się z tym najpierw i zwróć uwagę zwłaszcza na te rzeczy:

  1. Co się dzieje podczas poszczególnych faz (Initialization, Loading, Valdiation, Postback Event Handling, Rendering, Unload)
  2. Jakie zdarzenia są wywoływane w ramach tych faz
  3. Kiedy i jak jest zapisywany i odtwarzany stan z ViewState
  4. Kiedy i jak następuje obsługa zdarzeń (Postback Events)

Podpowiedź (w dużym uproszczeniu): Gdy naciśniesz ImageButton następuje PostBack do serwera HTTP. Wtedy też następuje odtworzenie stanu kontrolek z ViewState (w tym informacje o wywołanych zdarzeniach). Twoja kontrolka nie jest jednak dostępna (nie została utworzona podczas fazy Init) a co za tym idzie niemożliwe będzie odtworzenie stanu takiej kontrolki i wywołanie dla niej obsługi zdarzenia.

Web Forms to nie to samo co Win Forms!

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0