Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
UpdatePanel in einem UpdatePanel erstellen?
RocketRoN
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Chemnitz

Themenstarter:

UpdatePanel in einem UpdatePanel erstellen?

beantworten | zitieren | melden

Hallo,

ich habe ein weiteres Problem mit Updatepanels. In meinem Webprojekt möchte ich in einem Updatepanel, was ich in der .aspx Datei definiert habe ein weiteres UpdatePanel dynamisch über CodeBehind Datei auf Grund eines eintretenden Ereignisses definieren.

TEST.ASPX

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Workflow.Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true"></asp:ScriptManager>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:Panel ID="Panel1" runat="server"></asp:Panel>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />   
            </Triggers>
        </asp:UpdatePanel>
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="test2_click" />
    </form>
</body>

TEST.ASPX.CS


namespace Workflow
{
    public partial class Test : System.Web.UI.Page
    {
        protected Label lbl = new Label();

        protected void Page_Load(object sender, EventArgs e) { }
        
        protected void test_click(object sender, EventArgs e)
        {
            lbl.Text = DateTime.Now.ToString();
        }

        protected void test2_click(object sender, EventArgs e)
        {
            // UpdatePanel
            UpdatePanel up = new UpdatePanel();
            up.ID = "up1";
            up.UpdateMode = UpdatePanelUpdateMode.Always;

            // Label
            lbl.ID = "lbl1";

            // Button
            Button btn = new Button();
            btn.ID = "btn1";
            btn.Text = "Update";
            btn.Click += new EventHandler(test_click);

            // Content Template
            up.ContentTemplateContainer.Controls.Add(lbl);

            // Trigger
            AsyncPostBackTrigger tr = new AsyncPostBackTrigger();
            tr.ControlID = "btn1";
            tr.EventName = "Click";
            up.Triggers.Add(tr);

            // Button hinzufügen
            Panel1.Controls.Add(btn);

            // UpdatePanel hinzufügen
            Panel1.Controls.Add(up);
        }
    }
}

Der Erste Button wird beim Laden der Seite angezeigt. Beim Klicken auf diesen wird das ein weiterer Button geladen. Dies funktioniert auch ohne Probleme. Jedoch wird beim Klicken auf den zweiten Button nicht die gewünschte Methode ausgeführt, welche die aktuelle Zeit in einem Label ausgeben soll. Stattdessen verschwindet der zweite Button wieder und ich habe den Zustand, den ich am Anfang hatte, nachdem die Seite geladen wurde.

Was mache ich falsch, bzw was habe ich vergessen zubeacheten?

Grüße RocketRoN
private Nachricht | Beiträge des Benutzers
Tomot
myCSharp.de - Member

Avatar #avatar-2678.jpg


Dabei seit:
Beiträge: 706
Herkunft: Düsseldorf

beantworten | zitieren | melden

Du musst das Control im OnInit wieder herstellen und die gleiche ID zuweisen, damit das Control aus dem ViewState wieder hergestellt werden kann. Der zweite Button wird nur angezeigt, wenn der entsprechende Code wieder ausgeführt wird.
mit freundlichen Grüßen,
Tomot

Projekte: www.gesellschaftsspieler-gesucht.de
private Nachricht | Beiträge des Benutzers
RocketRoN
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Chemnitz

Themenstarter:

beantworten | zitieren | melden

In welchem OnInit()? Für welches Control?
Wenn ich den Code in die Page_Init einbinde, dann habe ich den zweiten Button immer da und nicht auf das Ereigniss des ersten Buttons hin.
private Nachricht | Beiträge des Benutzers
schaedld
myCSharp.de - Member

Avatar #avatar-2533.jpg


Dabei seit:
Beiträge: 1436
Herkunft: Schweiz

beantworten | zitieren | melden

Erstellen einer einfachen ASP.NET-Seite mit mehreren UpdatePanel-Steuerelementen wäre sicherlich ein guter Einstiegspunkt.
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

Moderationshinweis von MarsStein (24.02.2011 - 10:26:51):

Link angepasst.
Bitte aussagekräftigen Text für Links verwenden.

private Nachricht | Beiträge des Benutzers
RocketRoN
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Chemnitz

Themenstarter:

beantworten | zitieren | melden

Den Artikel hab ich schon gelesen. Nur ich möchte eine geschachteltes UpdatePanel in CodeBehind auf Grund eines Ereignisses erstellen und nicht in der aspx-Datei von Anfang an angeben. Wie das geht weis ich.

Nur wenn ich ein Updatepanel im CodeBehind auf ein Ereignis hin erstelle, bzw einem bestehendem Control hinzufüge, dann ist dieses UpdatePanel, wenn ich auf dessen Trigger klicke, wieder weg (siehe Code oben).

Wenn ich das UpdatePanel, was auf ein Ereignis hin einem Control hinzugefügt werden soll, in der OnInit Methode der Page initialisiere, dann funktioniert es. Zum tatsächlichen Anzeigen des UpdatePanels nutze ich dann die Visible-Eigenschaft.

Das hat aber leider einen Hacken. Ich erstelle dieses UpdatePanel auf Grundlage einer Datenbankabfrage, und da die OnInt() Methode bei jedem Ajax-Aufruf aufgeführt wird, erfolgt auch der Datenbankzugriff bei jedem Ajax-Aufruf, obwohl dieses UpdatePanel unberührt bleibt.

Gibt es eine Möglichkeit das eleganter zu Lösen um unnötige Ladezeit zu verkürzen und den Traffic zum Datenbankserver zu minimieren?

Grüße RocketRoN
private Nachricht | Beiträge des Benutzers
schaedld
myCSharp.de - Member

Avatar #avatar-2533.jpg


Dabei seit:
Beiträge: 1436
Herkunft: Schweiz

beantworten | zitieren | melden

UpdatePanels können auch Controls erhalten und das würde dann so aussehen:


UpdatePanel childPanel = new ChildPanel();
MyParentPanel.Controls.Add(childPanel);
Soweit ich dann aber weiss muss der Update Mode auf Conditional stehen, wenn Aktionen vom Codebehind her kommen.
Zitat
Gibt es eine Möglichkeit das eleganter zu Lösen um unnötige Ladezeit zu verkürzen und den Traffic zum Datenbankserver zu minimieren?
Gibt es, aber Performananz und Seitensource-Quelltext werden mit MS-Ajax immer grösser. Alternativ würde ich Dir raten JQuery und JQueryTemplates anzuschauen.
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
private Nachricht | Beiträge des Benutzers
RocketRoN
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Chemnitz

Themenstarter:

beantworten | zitieren | melden

Zitat
UpdatePanels können auch Controls erhalten und das würde dann so aussehen:

Das ist nicht das Problem, das habe ich alles schon soweit gelöst.
Zitat
Gibt es, aber Performananz und Seitensource-Quelltext werden mit MS-Ajax immer grösser. Alternativ würde ich Dir raten JQuery und JQueryTemplates anzuschauen.

Das ist eine Idee, werd ich mir mal anschauen.


Ich habe aber trotzdem noch eine Frage.

Bei einer ganz normalen OnClick()-Methode kann ich die objekt Variable auswerten, um herauszufinden, welches Control den Request ausgelöst hat.
z.B.:


protected void Button1_Click(object sender, EventArgs e)
{
   Button Test = (Button)sender;
}

In der OnInit()-Methode bekomme ich aber nur ein Page-Objekt zurück. Kommt man in der OnInit()-ethode trotzdem irgendwie an das Control, was den Request ausgelöst hat? Denn irgendwie wird das Objekt ja mit übergeben, denn sonst könnte man es ja nicht in der, zeitlich vom Ablauf her, späteren Methode auswerten.

Grüße RocketRoN
private Nachricht | Beiträge des Benutzers
schaedld
myCSharp.de - Member

Avatar #avatar-2533.jpg


Dabei seit:
Beiträge: 1436
Herkunft: Schweiz

beantworten | zitieren | melden

Vielleicht hilft Dir Page.Request.Params weiter, was in diesem Artikel (Understanding the JavaScript __doPostBack Function) erklärt wird.
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
private Nachricht | Beiträge des Benutzers
RocketRoN
myCSharp.de - Member



Dabei seit:
Beiträge: 14
Herkunft: Chemnitz

Themenstarter:

beantworten | zitieren | melden

Die Page.Request.Params hilft mir da weiter, nur leider funktioniert das ganze mit MS-Ajax ne so, wie ich mir das vorstelle. Werde mir bei Gelegenheit mal JQuery anschauen. Hab zu diesem Thema nur leider noch garkeinen Plan.
private Nachricht | Beiträge des Benutzers