3 Stimmen

Wie kann ich dynamisch erstellen/entfernen Steuerelemente, mit EventHandler, zu/von einer ASP.NET-Seite?

In einem meiner Projekte muss ich eine ASP.NET-Seite erstellen und einige der Steuerelemente müssen dynamisch erstellt werden. Diese Steuerelemente werden der Seite durch die Code-Behind-Klasse hinzugefügt und sie haben einige Event-Handler, die ihnen hinzugefügt werden. Bei den PostBacks haben diese Event-Handler viel damit zu tun, welche Steuerelemente dann auf der Seite angezeigt werden. Um die Geschichte kurz zu machen, funktioniert dies nicht für mich und ich scheine nicht in der Lage zu sein, dies herauszufinden.

Da mein Projekt ziemlich kompliziert ist, habe ich beschlossen, ein kurzes Beispiel zu erstellen, das auch nicht funktioniert, aber wenn Sie es so ändern können, dass es funktioniert, wäre das großartig, und ich wäre dann in der Lage, Ihre Lösung auf mein ursprüngliches Problem anzuwenden.

Das folgende Beispiel soll drei Schaltflächen auf einem Panel dynamisch erstellen. Wenn eine der Schaltflächen gedrückt wird, sollen alle Schaltflächen dynamisch neu erstellt werden, mit Ausnahme der Schaltfläche, die gedrückt wurde. Mit anderen Worten, blenden Sie einfach die Schaltfläche aus, die der Benutzer drückt, und zeigen Sie die beiden anderen an.

Damit Ihre Lösung hilfreich ist, können Sie die Schaltflächen nicht statisch erstellen und dann die Eigenschaft Visible verwenden (oder das Beispiel auf andere Weise drastisch ändern) - Sie müssen alle Schaltflächensteuerelemente bei jedem PostBack dynamisch neu erstellen (allerdings nicht unbedingt im Event-Handler). Dies ist keine Trick-Frage - ich weiß wirklich nicht, wie man das macht. Vielen Dank für Ihre Mühe. Hier ist mein kurzes Beispiel:

Aus der Datei Default.aspx:

<body>
    <form id="form1" runat="server">
    <div>
        <asp:Panel ID="ButtonsPanel" runat="server"></asp:Panel>
    </div>
    </form>
</body>

In der Code-Behind-Datei Default.aspx.cs:

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

namespace DynamicControls
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            AddButtons();
        }

        protected void AddButtons()
        {
            var lastClick = (string) Session["ClickedButton"] ?? "";

            ButtonsPanel.Controls.Clear();
            if (!lastClick.Equals("1")) AddButtonControl("1");
            if (!lastClick.Equals("2")) AddButtonControl("2");
            if (!lastClick.Equals("3")) AddButtonControl("3");
        }

        protected void AddButtonControl(String id)
        {
            var button = new Button {Text = id};
            button.Click += button_Click;
            ButtonsPanel.Controls.Add(button);
        }

        private void button_Click(object sender, EventArgs e)
        {
            Session["ClickedButton"] = ((Button) sender).Text;
            AddButtons();
        }
    }
}

Mein Beispiel zeigt die drei Schaltflächen, und wenn ich auf eine der Schaltflächen klicke, wird die gedrückte Schaltfläche ausgeblendet. Scheint zu funktionieren; aber nach diesem ersten Klick muss ich auf jede Schaltfläche klicken ZWEIMAL damit es versteckt wird. !?

3voto

Panos Punkte 18703

Ich denke, dass Sie die gleiche ID für Ihre Schaltflächen jedes Mal, wenn Sie sie hinzufügen, wie zum Beispiel so (in der ersten Zeile von AddButtonControl Methode):

var button = new Button { Text = id , ID = id };

EDITAR - Meine Lösung ohne Verwendung von session:

public partial class _Default : Page
{
    protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);
        AddButtons();
    }

    protected void AddButtons()
    {
        AddButtonControl("btn1", "1");
        AddButtonControl("btn2", "2");
        AddButtonControl("btn3", "3");
    }

    protected void AddButtonControl(string id, string text)
    {
        var button = new Button { Text = text, ID = id };
        button.Click += button_Click;
        ButtonsPanel.Controls.Add(button);
    }

    private void button_Click(object sender, EventArgs e)
    {
        foreach (Control control in ButtonsPanel.Controls)
            control.Visible = !control.Equals(sender);
    }
}

3voto

Aaron Powell Punkte 24630

Sie müssen sicherstellen, dass Ihre dynamischen Steuerelemente während der Pre_Init evento.

Siehe hier für den ASP.NET Page Lifecycle: http://msdn.microsoft.com/en-us/library/ms178472.aspx

Wenn Sie Ereignisse hinzufügen, müssen Sie dies spätestens bis zum Page_Load Methode und sie müssen bei jedem einzelnen Antrag hinzugefügt werden d.h. Sie sollten die Ereigniszuweisung niemals in eine !IsPostBack .

Sie müssen auch bei jeder einzelnen Anfrage dynamische Steuerelemente erstellen. ViewState wird die Neuerstellung nicht für Sie übernehmen.

1voto

tvanfosson Punkte 506878

Eine Sache, die mir aufgefallen ist, ist, dass, wenn Sie auf eine Schaltfläche klicken, Sie AddButtons() zweimal aufrufen, einmal in der Page_Load() und einmal im button_Click() Methode. Sie sollten wahrscheinlich die in Page_Load() in einem if (!IsPostBack) Block.

if (!IsPostBack)
{
   AddButtons();
}

0voto

gius Punkte 8855

AFAIK sollte das Erstellen von Steuerelementen nicht in Page_Load, sondern in Page_PreInit platziert werden (ViewState und SessionState wird vor Page_Load, aber nach Page_PreInit geladen).

Bei Ihrem Problem würde ich vorschlagen, die AddButtons-Funktion zu debuggen, um herauszufinden, was genau (und wann) in Session["ClickedButton"] gespeichert wird. Dann sollten Sie in der Lage sein, das Problem zu lösen.

0voto

Oscar Cabrero Punkte 4170

Die dynamisch hinzugefügten Steuerelemente werden nicht zwischengespeichert, so dass dies eines Ihrer Probleme sein könnte

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X