Laden...

UpdatePanel in einem UpdatePanel erstellen?

Erstellt von RocketRoN vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.443 Views
R
RocketRoN Themenstarter:in
13 Beiträge seit 2011
vor 13 Jahren
UpdatePanel in einem UpdatePanel erstellen?

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

691 Beiträge seit 2007
vor 13 Jahren

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

R
RocketRoN Themenstarter:in
13 Beiträge seit 2011
vor 13 Jahren

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.

1.433 Beiträge seit 2006
vor 13 Jahren
Hinweis von MarsStein vor 13 Jahren

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

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

R
RocketRoN Themenstarter:in
13 Beiträge seit 2011
vor 13 Jahren

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

1.433 Beiträge seit 2006
vor 13 Jahren

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.

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

R
RocketRoN Themenstarter:in
13 Beiträge seit 2011
vor 13 Jahren

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.

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

1.433 Beiträge seit 2006
vor 13 Jahren

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

R
RocketRoN Themenstarter:in
13 Beiträge seit 2011
vor 13 Jahren

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.