LinkButton ve vlastní komponentě   otázka

ASP.NET WebForms

Ahoj.

Mám vlastní komponentu, ve které dynamicky vytvářím LinkButton a přidávám jí nějakou událost:

LinkButton DeleteButton = new LinkButton();
{
DeleteButton.ID = DeleteButton.ClientID;
DeleteButton.Text = "Smazat";
DeleteButton.Click += new EventHandler(DeleteButton_Click);
}

a dále mám událost:

protected void DeleteButton_Click(object sender, EventArgs e)
{
this.Page.Response.Redirect(Pages.Eshop);
}

Když ale kliknu na ten LinkButton, přesměrování nenastane.

P.S.: Vím že by se tu víc hodil HyperLink, ale tohle je jenom test té události. Když tam dám něco jiného, tak to taky nefrčí

Díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A zavolá se vůbec příslušná metoda? Dejte si do ní breakpoint a uvidíte kde nastane chyba

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dal jsem tam breakpoint, spustil debug, ale vypadáto, že se ta událost nezavolá

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jinak ten linkbutton vytvářím ve vlastní komponentě v metodě CreateChildControls()

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mělo by to být takto:

LinkButton DeleteButton = new LinkButton();
DeleteButton.ID = DeleteButton.ClientID;
DeleteButton.Text = "Smazat";
DeleteButton.Click += new EventHandler(DeleteButton_Click);

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je teoreticky ten samý kód co mám já, akorát bez těch závorek. Ty tam mám ale jen proto, aby se mi v tom lépe orientovalo. Na funkčnost by to nemělo mít vliv.

Ostatně za zkoušku nic nedám, ale ani ted se mi to nepodařilo rozchodit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A v které události vkládáte/vytváříte linkbutton? Pokud v Page_load,tak to nepůjde,To už je moc pozdě na přiřazování Handlerů.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To už jsem tu jednou psal. Vytvářím to v události CreateChildControls(). Je to vlastní komponenta, která právě ten linkbutton obsahuje. Mý třída dědi od Control, ale zkoušel jsem už i WebControl, CompositeControl, ale pořád bez úspěchu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji, ale chtěl bych trošku něco jiného.

Potřebuju spustit serverovou událost tím LinkButtonem. Ono přesměrování v té metodě je pouze jako test, jestli se ta metoda provede. Až začne fungovat, nahradí přesměrování jiný kód.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkoušel jsem i celý kód v metodě CreateChildControls() přesunout do OnInit(), ale taky se to bohužel nezdařilo.

P.S.: Na stránce je těch mých komponent víc. Přidávám je cyklem foreach

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ted jsem to zkoušel a vše mi funguje korektně.Jediné v čem byl u mě rozdíl bylo to,že jsem nevytvářel linkbutton z komponenty,ale čistě dynamicky z kódu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, tak já nevím proč mi to nefunguje...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi bude problém přímo v té vaší komponentě.Záleží kdy se spouští metoda CreateChildControls()..jestli před Page_load nebo v ní.Já zkoušel dynamicky přidávat button v Page_init a vše ok.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tady je zjednodučený kód mé komponenty.

I po zjednodučení (tj. odebrání ostatních prvků) pořád nefunguje

using System;
using System.Collections.Generic;
using System.Text;

using System.Web.UI;
using System.Web.UI.WebControls;

namespace MyControls
{
    public class MyCustomControl: WebControl
    {
        public MyCustomControl()
        {
        }

        protected override void CreateChildControls()
        {
            LinkButton DeleteButton = new LinkButton();
            DeleteButton.ID = DeleteButton.ClientID;
            DeleteButton.Text = "Smazat";
            DeleteButton.Click += new EventHandler(DeleteButton_Click);
            this.Controls.Add(DeleteButton);
        }

        protected void DeleteButton_Click(object sender, EventArgs e)
        {
            this.Page.Response.Redirect("~/");
        }
    }
}

a do stránky přidávám:

protected override void OnLoadComplete(EventArgs e)
    {
        base.OnLoadComplete(e);
       this.PlaceHolder1.Controls.Clear();
        foreach (string ctlID in List1)
        {
            MyCustomControl c = new MyCustomControl();      
            this.PlaceHolder1.Controls.Add(c);
        }     
    }

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pozor, důležité je, aby jste komponenty ve stránce vytvořil pokaždé stejně - jak při prvním načtení, tak při postbacku. Pokud se událost nevyvolává, bude chyba nejspíš v tom - on podle dat ve formuláři není schopen poznat, kterému LinkButtonu událost patřila.

Zkontrolujte, že při každém načtení stránky (ať už normální, nebo postback) vytvoříte přesně stejnou hierarchii komponent.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpověd. Asi bude opravdu problém v tomto.

Jen ještě položím hloupý dotaz: Jak to mám zkontrolovat, a jak to případně napravit?

Díky moc

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, spíš jenom jak to napravit :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nastavte stránce v direktivě <%@ Page ... %> vlastnost Trace="True", ta zapne ladicí výpisy, kde si můžete strom komponent porovnat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mělo by ale stačit zkontrolovat, jestli LinkButton, kterým událost vyvoláváte, má v HTML markupu stejné ID jako ve stránce, která se objeví po kliknutí na něj.

V IEčku zmáčkněte F12, klikněte na první záložce na první ikonu v toolbaru (bílá kurzorová šipka) a ve stránce vyberte ono tlačítko.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkoušel jsem to jen s jednou komponentou na mé stránce, a linkbutton má vždy ID:

ctl00_ctl00_ContentCPH_ContentPlaceHolder1_ctl11

A přesto se událost nevyvolá...

Fakt už nevím co s tím...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To si s tím nikdo neví rady? :-(

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravim, tady vam dam priklad pridani LinkButtonu do vlastni komponenty, po klinuti presmeruje na www.seznam.cz.

public class MyCustomControl : CompositeControl
    {
        protected LinkButton lb = new LinkButton();

        // zde vytvorte vas control
        protected override void CreateChildControls()
        {
            lb = new LinkButton();
            lb.ID = "lb_1";
            lb.Text = "Ahoj";
            lb.Click += new EventHandler(lb_Click); // pridani udalosti

            this.Controls.Add(lb);
            base.CreateChildControls();
        }
        
        //udalost Click na LinkButton
        void lb_Click(object sender, EventArgs e)
        {
            System.Web.HttpContext.Current.Response.Redirect("http://www.seznam.cz");
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            lb.RenderControl(output);
        }
    }

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V jaké verzi frameworku je aplikace napsaná?

Zkoušel jsem vytvořit vlastní komponentu a vše funguje.Testováno na 3.5

nahlásit spamnahlásit spam 0 odpovědětodpovědět

.NET Framework 2.0

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte holt někde chybu.Já to zkoušel ve FR2.0.3.5 a 4.0 a všude to funguje naprosto korektně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zajímalo by mě, proč mi to nefunguje... Kde by mohla být jinde chyba než v komponentě?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak zkuste vytvořit novou komponentu - prázdnou - a dejte do ní pouze kód ohledně linkbuttonu.Pak uvidíte ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kod komponenty (oříznuté)


    public class CommentView : CompositeControl
    {
        private LinkButton DeleteButton;

        protected override void CreateChildControls()
        {
            Controls.Clear();

            DeleteButton = new LinkButton();
            DeleteButton.ID = DeleteButton.ClientID;
            DeleteButton.Text = "Smazat";
            DeleteButton.Click+=new EventHandler(DeleteButton_Click);

            this.Controls.Add(DeleteButton);
        }

        void DeleteButton_Click(object sender, EventArgs e)
        {
            this.Page.Title = "Hello";
        }
    }

Přidávám jí:

 protected override void OnLoadComplete(EventArgs e)
    {
        base.OnLoadComplete(e);
        Build();      
    }    
private void Build()
    {
        this.PlaceHolder1.Controls.Clear();
        foreach (string ID in Category1.IDs)
        {
            MyView c = new MyView();
            c.ID = ID;
            this.PlaceHolder1.Controls.Add(c);
        }
    }

A pořád.... nic.... ;-(

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vyzkoušel jsem tento kód a vše mi funguje :

protected override void CreateChildControls()
        {
            Controls.Clear();
LinkButton linkbtn = new LinkButton();
            linkbtn.ID = linkbtn.ClientID;
            linkbtn.Text = "Linkbutton";
            Controls.Add(linkbtn);

            linkbtn.Click += new EventHandler(button_click);
        }

        protected void button_click(object sender, EventArgs e)
        {
            Page.Response.Redirect("http://www.seznam.cz");
        }

Svoji komponentu následně jen zaregistruji a použiji ve stránce.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Níže přikládám návod jak debugovat stored procedury - nezkoušel jsem to,ale mělo by to tak fungovat taky -

http://www.asp.net/data-access/tutorials...

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback