Laden...

LinkButton Events DLL zu ASPX Page

Erstellt von Sera vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.744 Views
S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren
LinkButton Events DLL zu ASPX Page

Sauber programmieren, dynamisch generieren .... Kopfweh 😁

Zu meinem Problem:

In einer externen DLL wird ein Menü generiert, daß mir das generierte Menü in einem PlaceHolder platziert und an die aufrufende ASPX Seite zurückgibt.


        public static PlaceHolder BuildMainNavigation(ImageData imageSeperator, string[] menuItems)
        {
            PlaceHolder ph = new PlaceHolder();
            
            //Defines the image seperators in HTML as ASP.NET literal
            string sLiteralText = "<img src=" + imageSeperator.Name + " width="+ imageSeperator.Width + 
            " height="+ imageSeperator.Height +" />";

            //menu building loop
            for (int i = 0; i <= menuItems.GetUpperBound(0); i++)
            {
                //add Literal for displaying image
                Literal literal = new Literal();
                literal.Text = sLiteralText;

                //add LinkButton
                LinkButton lb = new LinkButton();
                lb.Text = menuItems[i];
                lb.CssClass = "layout.css";
                //lb.Click += new EventHandler(MenuItem_Click);
                

                ph.Controls.Add(literal);
                ph.Controls.Add(lb);
            }

            return ph;
        }

In der aufrufenden ASPX Seite gibt es eine Methode "MenuItem_Click", wo eigentlich die MenüItemKlick Events gefeuert werden sollten. Geprüft wird nach Menünamen.

Nun, in der DLL kann ich das "Click" adden vergessen, da die Methode in der ASPX Seite implementiert ist. Welche Möglichkeiten habe ich nun, dieses Event einzubauen? CommanArgument geht z.B locker und es steht dann auch korrekt in der HTML Syntax.

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,
die LinkButtons stehen ja in der Controls-Collection des Placeholders.
Du könntest also in einer foreach-Schleife da durchlaufen


foreach(Control c in myGeneratedPlaceholder.Controls)
{
  if(c is LinkButton)
  {
     ((LinkButton)c).Click += new EventHandler(MenuItem_Click);
  }
}

oder Du vergibst ID's für die LinkButtons, dann kannstDu über FindControl() danach suchen

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

Hi,

leider geht es auch so nicht. Er hängt die Events zwar fehlerlos an, aber die Child Controls verschwinden auf der Seite.

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

Nein, so funktioniert es leider nicht. Zeigt nun zwar die MenuItems an aber die Eventmethode wird nicht aufgerufen.

3.170 Beiträge seit 2006
vor 17 Jahren

Vielleicht musst du das PostBack-Event auslösen damit er's rafft.
Probier das mal:


foreach(Control c in myGeneratedPlaceholder.Controls)  
{
    if(c is LinkButton)
    {
       ((LinkButton)c).Attributes.Add("onclick",ClientSript.GetPostBackEventReference(c, c.ID));
    } 
}

EDIT: Wird so wahrsch. noch nicht ganz funzen, aber guck Dir mal die Doku zu den PostBack-Events an. Und das hier:

ms-help://ms.netframework.v20.de/dv_ASPNETCon/html/6304bff7-1b0e-4641-8acb-6d3b0badc4a3.htm

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

3.170 Beiträge seit 2006
vor 17 Jahren

Könntest du nich viel einfacher in der Schleife das hier machen?

((LinkButton)c).CommandName = "MenuItem_Click";
((LinkButton)c).CommandArgument = "was das MenüItem identifiziert"; 

EDIT:
DasArgument könntest Du auch schon innerhalb der dll setzen, z.B. auf den Menütext.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

leider nein, bringt auch nix

3.170 Beiträge seit 2006
vor 17 Jahren

Versteh ich nicht. Kannst Du mal die aspx.cs dzu posten?

EDIT:
Auf jeden Fall die Methode und die Stelle mit der Schleife.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

Habe ich oben gepostet. CommandName und CArgeument bringen nur in Verbindung eines funktionierenden Events was.

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

Aber was hältst du von Delegates?

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,

Habe ich oben gepostet.

Das hatte ich nicht gemeint, ich wollte mal den Code-Teil der aspx-Page sehen.
Da gehört die von mir vorgeschlagene Schleife ins Page_Load

Edit: Oder wo du halt sonst dden Aufruf an die o.g. dll machst.

CommandName und CArgeument bringen nur in Verbindung eines funktionierenden Events was.

Wie meinst Du denn das? Wenn Du das CommandName einträgst, und Die MenuItem_Click Methode ein entsprechender EventHandler, dann wird doch das Event beim Clickenausgelöst.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

            string[] menuItems = new string[] {"Test1","Test2","Test3"};
            PlaceHolder pTemp = Dynamic.BuildMainNavigation(id, menuItems);
            

            //Add Events
            foreach (Control ctrl in pTemp.Controls)
            {
                if (ctrl is LinkButton)
                {
                    ((LinkButton)ctrl).Click+= new EventHandler(MenuItem_Click);
                    
                    
                }
            }

            PlaceHolder1.Controls.Add(pTemp);
        }
    }

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

3.170 Beiträge seit 2006
vor 17 Jahren

ich probiers mal aus mom... muss nen anderen Rechner hochfahren.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

3.170 Beiträge seit 2006
vor 17 Jahren

Bei mir hat folgendes einfache Beispiel funktioniert:

Default.aspx: unverändert gelassen wie von VS 2005 erstellt.

Default.aspx.cs:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default: System.Web.UI.Page
{
  public static PlaceHolder BuildMainNavigation(string[] menuItems)
  {
    PlaceHolder ph = new PlaceHolder();
    foreach(string s in menuItems)
    {
      //add LinkButton
      LinkButton lb = new LinkButton();
      lb.Text = s;
      lb.CssClass = "layout.css";
      //lb.Click += new EventHandler(MenuItem_Click);


      ph.Controls.Add(lb);
    }

    return ph;
  }
  protected void Page_Load(object sender, EventArgs e)
  {
    string[] para = { "Hallo", "Welt" };
    PlaceHolder ph = BuildMainNavigation(para);
    foreach(Control c in ph.Controls)
    {
      if(c is LinkButton)
      {
        ((LinkButton)c).Click += new EventHandler(MenuItem_Click);
      }
    }
    Form.Controls.Add(ph);
  }
  protected void MenuItem_Click(object sender, EventArgs e)
  {
    int i = 0;
  }
}

Mit dem Debugger komme ich dann in MenuItem_Click vorbei!
Das sollte dann auch bei dir klappen, denn wo jetzt der Placeholder erstellt wird, spielt keine Rolle.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

Hi,

Ja, so ist es ja einfach. Jedoch soll nicht auf jeder Seite der gleiche Code stehen.

public static PlaceHolder BuildMainNavigation(string[] menuItems)
ist ein externer Teil, sonst wird ja der Code mit der Zeit unübersichtlich und der Begriff Softwaredesign ist nutzlos. Mehrfachverwendung von Code ist designtechnisch schlecht.

3.170 Beiträge seit 2006
vor 17 Jahren

Original von MarsStein
Das sollte dann auch bei dir klappen, denn wo jetzt der Placeholder erstellt wird, spielt keine Rolle.

Damit meinte ich es ist im Prinzip wurscht ob der Placeholder aus einer dll kommt.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

3.170 Beiträge seit 2006
vor 17 Jahren

Ich habe bei mir gerade die Funktion BuildMainNavigation() in eine externe dll umgebogen.
DasEvent wird nach wie vor angesprungen. Dein Fehler muss woanders sein.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

Stelle bitte mal den kompletten Code der DLL rein. Danke!

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

Ich habe den Fehler, ich habe keinen Postback zugelassen. Jedenfalls danke für die Hilfe.

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

Übrigens, wer programmiert hier in ASP.NET 2.0? Menu Control wäre die richtige Antwort gewesen 8)

3.170 Beiträge seit 2006
vor 17 Jahren

Übrigens, wer programmiert hier in ASP.NET 2.0? Menu Control wäre die richtige Antwort gewesen

Hat sich für mich so angehört alswolltest Du was eigenes machen 😉

EDIT:
Und das Thema des Threads lautet auch nicht "Wie am besten Menü implemmentieren" sondern wie man ein "LinkButton Events DLL zu ASPX Page" das sollte dann auch beantwortet werden -> eslesen ja auch andere denThread.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
Sera Themenstarter:in
285 Beiträge seit 2005
vor 17 Jahren

Ja klar, hat sich wahrscheinlich so angehört. Das Menu Control habe ich auch zu erst später entdeckt.