Avatar billede mikkelk Nybegynder
21. januar 2006 - 22:32 Der er 13 kommentarer og
1 løsning

Postback, custom servercontrol og loadpage

Ok, lidt rodet overskrift, men problemet er som følger:
Jeg har en servercontrol, som bl.a. indeholder en login-form. Login-formen raiser en event når der klikkes på login.
Desuden lister serverkontrollen en række værdier, som tilføjes ved load_page.
Det virker glimrende, bortset fra når man klikker på login, så er det som om serverkontrollen bliver renset for de værdier der var lagt ind i den ved load_page - hvad sker der?
Avatar billede mikkelk Nybegynder
21. januar 2006 - 22:43 #1
Det skal iøvrigt nævnes at serverkontrollen fyldes med data i load_page på siden default.aspx, mens eventen håndteres i tilhørende masterpage...
Avatar billede snepnet Nybegynder
21. januar 2006 - 23:57 #2
ikke lige til at svare på ud fra det du siger synes jeg.... er det asp.net 2.0 du arbejder med, og hvordan har du bygget din serverkontrol?
og... hvordan kan det være at du selv har lavet en serverkontrol der huser en login-kontrol + andet?
mvh
Avatar billede mikkelk Nybegynder
22. januar 2006 - 13:48 #3
Ja, det er .net 2.0
Har lavet den for at lære lidt mere om hvordan man laver serverkontroller...
Avatar billede snepnet Nybegynder
22. januar 2006 - 17:14 #4
ok ... prøv at post koden til kontrollen her.
mvh
Avatar billede mikkelk Nybegynder
22. januar 2006 - 17:42 #5
hmm...har så lavet den en del om... men har følgende kode, hvor jeg har problemet med at smide noget ind i værdien ErrorMessage i forbindelse med event:


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

namespace JegStener.Framework.Controls
{
    public class LogForm : Control, INamingContainer
    {
        //Private strings til username og password
        private string _UserName;
        private string _UserPass;
        private bool _Persistent;
        private string _ErrorMessage;

        //Eventhandler
        public event EventHandler Login;

        //Properties username og password
        public string UserName
        {
            get { return _UserName; }
        }
        public bool Persistent
        {
            get { return _Persistent; }
        }
        public string UserPassword
        {
            get { return _UserPass; }
        }
        public string ErrorMessage
        {
            set { _ErrorMessage = value; }
            get { return _ErrorMessage; }
        }

        //Funktion til at håndtere og raise events
        protected void OnChange(EventArgs e)
        {
            //Raise login-event
            Login(this, e);
        }

        //Generer underkontroller
        protected override void CreateChildControls()
        {
            //Add HTML og tekst
            this.Controls.Add(new LiteralControl("<div class=InfobarHeadline>Login</div>"));
            this.Controls.Add(new LiteralControl("<div class=InfobarItem>"));
            this.Controls.Add(new LiteralControl("Brugernavn: "));

            //Brugernavn-textboks
            TextBox BrugernavnBox = new TextBox();
            //Tilføj Onchange-event
            BrugernavnBox.TextChanged += new EventHandler(this.BrugernavnBox_Change);
            this.Controls.Add(BrugernavnBox);

            //Password tekst og textboks
            this.Controls.Add(new LiteralControl("Password: "));
            TextBox PasswordBox = new TextBox();
            PasswordBox.Text = _UserPass;
            //Tilføj Onchange-event
            PasswordBox.TextChanged += new EventHandler(this.PasswordBox_Change);
            this.Controls.Add(PasswordBox);

            //Persistent-Login-checkbox
            CheckBox PersistentCheckBox = new CheckBox();
            PersistentCheckBox.Text = "Husk Login";
            this.Controls.Add(PersistentCheckBox);

            //Login-button
            Button LogButton = new Button();
            LogButton.Text = "Log ind";
            //Tilføj OnClick-event
            LogButton.Click += new EventHandler(this.LogButton_Click);
            this.Controls.Add(LogButton);
            this.Controls.Add(new LiteralControl("</div>"));
            if (_ErrorMessage != null)
            {
                this.Controls.Add(new LiteralControl("<div id=\"ErrorMessage\" runat=\"server\">" + _ErrorMessage + "</div>"));
            }
        }

        //Håndter event, onchange for brugernavn
        private void BrugernavnBox_Change(Object sender, EventArgs e)
        {

        }

        //Håndter event, onchange for password
        private void PasswordBox_Change(Object sender, EventArgs e)
        {
            //ComeON(EventArgs.Empty);
        }

        //Håndter event, onclick for login-button
        private void LogButton_Click(Object sender, EventArgs e)
        {
            //Gem indtastede værdier i private variable
            this._UserName = ((TextBox)Controls[3]).Text;
            this._UserPass = ((TextBox)Controls[5]).Text;
            this._Persistent = ((CheckBox)Controls[6]).Checked;
            if (((TextBox)Controls[3]).Text.Trim() == "")
            {
                _ErrorMessage = "Du har glemt brugernavn...";
            }
            //Kald eventraiser
            OnChange(EventArgs.Empty);
        }

    }

}
Avatar billede snepnet Nybegynder
22. januar 2006 - 18:49 #6
det er nok ikke fordi du ikke kan få sat variablen - men createchildcontrol kører før din eventhandler - så opbygger kontrollen udfra den errormessage der er før du kører din handler.
mvh
Avatar billede mikkelk Nybegynder
22. januar 2006 - 18:54 #7
Hvad er løsningen så på det?
Avatar billede snepnet Nybegynder
22. januar 2006 - 19:02 #8
når du skriver sådan her:

if (_ErrorMessage != null)
{
  this.Controls.Add(new LiteralControl("<div id=\"ErrorMessage\" runat=\"server\">" + _ErrorMessage + "</div>"));
}

tilføjer du eksplicit en specifik tekst.

hvis du istedet gjorde sådan her:
(bare et eksempel)

// klassevariabel
private LiteralControl literal;

// i cratechildcontrol
if(_errorMessage != null)
{
  literal = new LiteralControl;
  Controls.Add(literal);
}

// og i din handler
literal.Text = "...";

så ville det medfører at din literal bare blev renderet sammen med resten, hvilket sker efter din handler er eksekveret, hvilket så igen ville medføre at det er den tekst du har sat i din handler du får vist.

men... du kan også gøre det, at du sørger for at den slags helt generelt først angives ved renderingen.

protected override void Render(HtmlTextWriter writer)
{
  // her sørger du så for at angive hvordan kontrollen tingene skal foregå
  base.Render(writer);
}

mvh
Avatar billede mikkelk Nybegynder
22. januar 2006 - 19:12 #9
Så al den kode jeg lige nu har i CreateChildControls() skal smides ind i Render(HtmlTextWriter writer) istedet?
Avatar billede snepnet Nybegynder
22. januar 2006 - 19:18 #10
nu er der forskellige måder at gøre tingene på.... den kontrol du har lavet betegnes typisk som en composite control (altså en kontrol der blot sætter andre kontroller ind).
en anden type - den man kalder rendered controls - producerer typisk output ved at overskrive rendermetoden.
den sidste type er vanligvis den med bedst performance, men den første giver et rart "hands-on" med kontrolhierarkiet.

jeg synes du skal gøre som du har gjort nu, men modificere det så det virker som det første eksempel du fik, eller indsætte den specifikke kontrol i forbindelse med renderingen - hvis der står noget i errormessage - sådan her:

protected override void Render(HtmlTextWriter writer)
{
  if(_errorMessage != null)
  {
    Controls.Add(new LiteralControl("..."));
  }
  base.Render(writer);
}

mvh
Avatar billede mikkelk Nybegynder
22. januar 2006 - 20:00 #11
Er der en mulighed for i Render(HtmlTextWriter writer) at smide en childcontrol ind i toppen istedet for i bunden?
Avatar billede snepnet Nybegynder
22. januar 2006 - 20:06 #12
du kan benytte Controls.AddAt(int index, control control), men du kan også i din createchildcontrols sætte en placeholder ell. ind - så du kan proppe kontrollen derind istedet (hvis det bliver nødvendig).

// klassevariabel
protected Panel errorMessagePanel;

// createchildcontrols
errorMessagePanel = new Panel();
Controls.Add(errorMessagePanel);

// i render
if(errorMessage != null)
{
  errorMessagePanel.Controls.Add(new LiteralControl(errorMessage));
}

mvh
Avatar billede mikkelk Nybegynder
23. januar 2006 - 12:04 #13
Jeg takker mange gange for dine svar! Det virker bare!
Smid et svar så du kan få point...
Avatar billede snepnet Nybegynder
23. januar 2006 - 17:00 #14
var så lidt :o)
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester