C#: PreRender und Eventhandler bei dynamischen Buttons

Ryandel

Grünschnabel
Hallo ich bin neu hier und werkel zur Zeit an einer Webapplikation (Im Bereich C# bin ich dann schon nciht mehr ganz so neu ;) )

Mein Problem ist folgendes:
In einem Teil der WebApp werden dynamisch Buttons erstellt welchen ich durch Button.Click += new EventHandler(edtAct_Click); Ein Event zuweisen möchte...tut sich leider nix; Bei statischen Buttons ist alles normal. Ich vermute, dass die Konstruktion aus PreRender bei mir das Problem sein könnte, aber muss leider so gemacht werden...

Code:
namespace LiveReport.forms
{
    public partial class projekteDetails : System.Web.UI.Page
    {
		//Interfaces
        KB.Interfaces.IBL myBL = new KB.BL.BL();
        #region myPageLoad
        private void myPageLoad()
        {
            int ID=1;
            FillProjekt(ID);
        }
        #endregion

        protected void FillProjekt(int P_ID)
        {
            if (P_ID == 0) return;
            DataSet dsProjekt = myBL.getProjekt(P_ID);
            DataRow Projekt = dsProjekt.Tables[0].Rows[0];
            txtName.Text = Projekt.ItemArray[1].ToString();
            txtPercent.Text = Projekt.ItemArray[3].ToString();
            caEnde.Text = Projekt.ItemArray[4].ToString();

            string[] activities = { "1","2","3"};
            int i = 0;

            foreach (string activity in activities)
            {
                TableHeaderRow aktHead = new TableHeaderRow();
                TableHeaderCell aktHeadc = new TableHeaderCell();
                aktHeadc.Text = activity;
                aktHead.Cells.Add(aktHeadc);
                Modules.Rows.Add(aktHead);
                DataSet dsEnde = myBL.getModules(P_ID, i++);
                foreach (DataRow dr in dsEnde.Tables[0].Rows)
                {
                    TableRow newrow = new TableRow();
                    TableCell newcell = new TableCell();
                    newrow.Cells.Add(newcell);

                    TableCell controls = new TableCell();
                    Button edit = new Button();
                    edit.ID = "edtAct" + dr.ItemArray[0].ToString();
                    edit.Text = "PUSH";
                    edit.Click += new EventHandler(edtAct_Click);

                    controls.Controls.Add(edit);
                    newrow.Cells.Add(controls);
                    
                    Modules.Rows.Add(newrow);
                }
            }
        }


        #region PreRender
        protected void Projekte_PreRender(object sender, System.EventArgs e)
        {
            DataBind();
            this.myPageLoad();
        }
        #endregion

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }

        private void InitializeComponent()
        {
            this.PreRender += new System.EventHandler(this.Projekte_PreRender);

        }

        protected void savenewAct(object sender, EventArgs e)
        {
            //Dieser Button funktioniert, ist der statische
            //myBL.insertAct(P_ID,act)
        }

        protected void edtAct_Click(object sender, EventArgs e)
        {
            string actID = ((Button)sender).ID;
            //Hier tut sich nix, ist der dynamische
        }

        #endregion
    }
}

Hoffentlich kann mir iwer hier helfen.:(

Gruß
Ry
 
Mir springt kein Fehler ins Auge.
Ruf doch mal probeweise direkt nach dem hinzufügen des Click-Handlers die Button.PerformClick-Methode auf und gehe mit dem Debugger ein Einzelschritten durch den Code. So kannst du herausfinden, ob der EventHandler wirklich nicht richtig gesetzt wird.
 
Hallo Shakie,

also mir bietet die Programmierhilfe dir PerformClick Methode nichtmal an, fehlt da nen using Verweis?
Die PerFormClick Methode scheint es nur zu geben wenn man im namespace System.Windows.Forms arbeitet, ich bin aber dadurch dass es sich um eine Webanwendung handelt im namespace LiveReport.forms...

trotzdem schon mal danke für deine Hilfe.
 
Zuletzt bearbeitet:
Ich habe das ganze nochmal durchgetestet und mir ist aufgefallen, dass er beim Klick auf einen der Buttons nicht nur den Button als objekt im PostBack parst sondern die komplette seite.

Hatte per string test = ((Button)sender).ID; versucht die ID des Buttons abzufangen...komisch ist auch, dass ich in nem ähnlichen Projekt das genauso gelöst habe mit den dynamischen Buttons es da aber geht. Bin echt am verzweifeln.

Gruß
Ry
 
PUSH

Ich habe nochmal etwas rumprobiert. Die Applikation ignoriert sogar gekonnt Lambda-Verweise alá:

Code:
pushAct.Click += (clicker, args) =>
                {
                    tueirgendwas();
                };

Also bekomme ich generell aus allen Button.Click nur nen Postback ohne Daten das wars...arg ich raffs nicht. Das muss doch funktionieren!
 
Was war denn der Fehler? Vielleicht hat der eine oder andere Leser einmal das selbe Problem wie du und freut sich bestimmt, wenn er deine Lösung erfahren darf :)
Du könntest dann noch den Status des Themas auf "erledigt" ändern.
 
Woran genau es lag kann ich nicht sagen.
Ich habe den fraglichen Teil des Programms aus dem PreRender entfernt und nach Page_Load verschoben. Danach dann darauf achten dass auf die entsprechenden Teile aus dem PreRender noch ein DataBind() gesetzt wird, da das Programm sonst die Inhalte "vergisst".

Scheinbar bekommt das Programm es nicht mit wenn im PreRender irgendwas ausgeführt wird, wäre so meine Idee dazu.

Gruß
Ry
 

Neue Beiträge

Zurück