[ASP.NET] Custom Button probleem met properties

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Beejee0
  • Registratie: Maart 2011
  • Laatst online: 11-09-2023
Zou iemand me kunnen helpen met mijn custom control (button).
In de constructor van deze control check ik of de knop enabled is en pas afhankelijk daarvan de achtergrond van de knop aan.
Nu is het probleem dat als ik in mijn code behind van een pagina de property(enabled) op false zet en de knop gewoon de zelfde opmaak behoudt. Als ik echter kijk met Firebug zie ik dat deze wel op disabled staat.
Klikken op de knop lukt op dat moment wel niet meer(positief).
Tijdens het debuggen zie ik dat hij bij het refreshen de constructor weer doorloopt en hij terug de waarde true bij enabled heeft. Wat zeker ook bijdraagt bij het probleem is dat de constructor van de button uitgevoerd wordt voordat het clickevent enabled op false zet.

Ik heb al geprobeerd de OnPreRender, Render, OnInit te gebruiken ipv alles in de constructor te stoppen.
Zonder enig resultaat

Ik zit al een halve dag te werken aan deze component en heb zelf al heel wat onderzoek gedaan. Desondanks kan ik geen oplossing vinden.




Code:
C#: Custom Button
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
namespace MyCustomControls
{
    public class ACMWizardStep : System.Web.UI.WebControls.Button
    {
        public int Zindex
        {
            set {base.Style.Add("z-index", value.ToString());}
        }

        public ACMWizardStep()
        {

            base.BackColor = Color.Transparent;
            base.BorderStyle = BorderStyle.None;

            base.Height = 35;
            base.Width = 102;
            base.ForeColor = Color.FromName("#ECEFF0");
            base.Font.Bold = true;

            base.Style.Add("position", "relative");
            base.Style.Add("float", "left");
            base.Style.Add("margin-right", "-18px");

            base.Style.Add("text-shadow", "1px 1px 1px #31899B");

            if (base.Enabled)
            {
                base.Style.Add("background-image", "url(../../Images/Wizard/Active.png)");
                base.Style.Add("cursor", "pointer");
            }
            else
            {
                base.Style.Add("background-image", "url(../../Images/Wizard/Disabled.png)");
                base.Style.Add("cursor", "default");
            }

            base.Attributes.Add("onmouseover", "this.style.textShadow='0px 0px 10px #fff'; this.style.textDecoration='underline';");
            base.Attributes.Add("onmouseout", "this.style.textShadow='1px 1px 1px #31899B'; this.style.textDecoration='none';");
        }
        
    }
}


//De code van mijn pagina waar ik deze component gebruik
        protected void WizardSteps_Click(object sender, EventArgs e)
        {
            WizardStep2.Enabled = true;
            UpdatePanel2.Update();
        }

Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Er zijn meer stappen dan de OnPrerender e.d.

Ik zou zeggen ga eens op zoek naar de ASP.Net page lifecycle. Dan wordt het wel duidelijk waarom je code niet in de constructor thuis hoort.

Wat er gaande is is dat de status van je control in de viewstate wordt ingeladen. Maar, er is een moment dat deze weer wordt teruggemapped aan je control. Dit gebeurd tussen de OnInit en de OnLoad in.
Dus als je je code in de OnLoad zet dan zou je Enabled property in ieder geval goed moeten staan.

Dat gezegd, geef je aan dat je het ook al in de OnPreRender hebt gezet, deze events vinden plaats na de OnLoad. Dus als je het al daar in hebt gezet, en het werkte niet, dan is er ergens nog iets anders gaande.

In ieder geval hoort deze code niet in de constructor thuis.

Acties:
  • 0 Henk 'm!

  • DoDo
  • Registratie: Juli 2001
  • Laatst online: 17:00
Nog even een tip, ik zou de control gewoon een CSS Class geven en alle styles apart in een css file definiëren.
Dan heb je al je opmaak op een plek, en mocht er iets veranderden hoef je niet opnieuw te compilen.

Acties:
  • 0 Henk 'm!

  • Beejee0
  • Registratie: Maart 2011
  • Laatst online: 11-09-2023
Het is me gelukt dankzij DeathRaven.
Ik heb de code van de stijl in een de onLoad gezet en de controlestructuur ivm de enabled propertie in de OnPreRender.
Dit gaf voor mij het beste resultaat.

De stijl van de component ga ik wel niet in de css-stylesheet zetten aangezien deze nooit zal veranderen. Daarom dat ik er ook een component van maakte. Die ik dan gemakkelijk kan aanspreken en op disabled zetten.