PlaceHolder v ASP.NET pod C#, vytváření v pohodě, ale hlavně změna vytvořeného   otázka

C#, ASP.NET WebForms, Databáze

Zdravím vespolek..

Již několikrát jsem se zde dopídil pomoci, poprosím o další :-)

Vytvářím stránku kde pomocí PlaceHolder vytvořím dopředu neznámý počet (dle výstupu z DB) tlačítek.

Každé tlačítko dostane do vínku různé parametry, jako např. barvu textu, text vlastní, id atd..

Vše mi funguje jak má do doby kdy potřebuji, cca 1x za minutu, provést změnu popisu těchto vygenerovaných tlačítek.

Toto jsem chtěl všechno provádět v UpdatePanelu.

Na stránce se vyskytují i datagridy a další prvky, také umístěné v Update Panelech.

Pokud někdo ví, prosím o pomoc..

Díky Karel Láska

Generování tlačítek:

        override protected void OnInit(EventArgs e)
        {
                        Button btnNew = new Button();
                        btnNew.ID = string.Format("btnNew{0}", dataReader2["ID"].ToString());

                        btnNew.ToolTip = ToolTip;
                        btnNew.Font.Size = 8;
                        btnNew.Text = Napis;
                        btnNew.Width = 55;
                        btnNew.Height = 55;
                        btnNew.CommandName = "New";
                        btnNew.CommandArgument = dataReader2["ID"].ToString();
                        btnNew.Click += new EventHandler(MyBtnHandler);
                        btnNew.Style.Value = "Position:Absolute; left:" + (System.Convert.ToDouble(dataReader2["RozlozeniX"]) + KorekceX).ToString() + "px; top:" + (System.Convert.ToDouble(dataReader2["RozlozeniY"]) + KorekceY).ToString() + "px;";
                        placeCtrls.Controls.Add(btnNew);
                    base.OnInit(e);

                    }

Zhruba takto (vynecháno vyčítání z DB..)

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

Prvním předpokladem je, že vám v okamžik, který označujete jako "cca 1x za minutu" dojde k AJAX postbacku, který bude obnovovat daný UpdatePanel. To musíte inicializovat z klienta tj. z JavaScriptu, pravděpodobně nějakým timerem. Akci timeru můžete realizovat například programovým vyvolání kliknutí na skryté tlačítko

function () { document.getElementById('<%: this.RefreshPanelButton.ID %>').click(); })

<asp:LinkButton ID="RefreshPanelButton" runat="server" ClientIDMode="Static" CausesValidation="false" style="display:none;" />

Toto tlačítko bude buď uvnitř UpdatePanelu, nebo mimo, ale zaregistrované pomoci RegisterAsyncPostBackControl:

ScriptManager.GetCurrent(this.Page).RegisterAsyncPostBackControl(this.RefreshPanelButton);

Co se týče generování vs. manipulace s existujícími prvky:

Pokud pro danou část (UpdatePanel) stránky nebudete mít zapnutý view state, musíte tlačítka podle dat z db generovat pokaždé (tj. i pří obnovování update panelu pomoci Async postbacku).

Tím je vytvoříte rovnou obnovené tj. víc nepotřebujete řešit.

Takto to zřejmě již děláte, soudě z toho, že ve vašem kódu generujete tlačítka už ve fázi OnInit (kde viewstate ještě obnovený není).

Druhou variantou je nechat prvky obnovit z view state a při postbacku s nimi manipulovat pomoci

var button = (Button)FindControl(string.Format("btnNew{0}", ID);

Preferujte ale první variantu.

A v poslední řadě, co se týče samotného generování prvků, mnohem čistší by bylo použít prvek Repeater a model binding, náznak příkladu:

<asp:Repeater runat="server" ItemType="Data.Models.Button" SelectMethod="GetButtons">
    <ItemTemplate>
        <asp:Button runat="server" Text='<%# Item.Nadpis %>' CommandName="New" CommandArgument='<%# Item.ID %>' OnClick="MyBtnHandler" />
    </ItemTemplate>
</asp:Repeater>
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím,

moc děkuji za vaši odpověď.

Update panel jsem chtěl obnovovat z AJAX Extension - Timeru.

Důvod byl prostý - občas, velmi vyjímečně jsem potřeboval obnovit i po editaci datagridu. Ale to bych oželel :-)

Zkusil jsem přepracovat dle Vašeho návrhu stránku.

Bohužel tu mám malé ale :-(

Pokud zaregistruji

ScriptManager.GetCurrent(this.Page).RegisterAsyncPostBackControl(this.RefreshPanelButton);

přestane mi obnovování úplně fungovat.

To samé při uzavření do UpdatePanelu. Přestane mi fungovat obnovení..

Co se týká prvků, bohužel nemohu prvek Repeater použít. Jde o to že tlačítka jsou rozmístěna po celé stránce dle nastavení uživatele. Takže při vytváření dostávají i souřadnice, kde se budou zobrazovat.

S díky za minulou radu a event. díky za radu další :-)

Karel Láska

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

Zkuste tomu tlačítku nastavit nějaké serverové OnClick tj. např. OnClick="RefreshPanelButton_Click"

Na serveru může být třeba i obsluha prázdná

protected void RefreshPanelButton_Click(object sender, EventArgs e)
{
}

Pokud to tak máte, nebo to nepomůže, dejte sem jak vám aktuálně vypadá ascx/aspx (relevantní část).

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