[c#] .Text property doet vreemd bij user control

Pagina: 1
Acties:

  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
#1

Ik heb een UserControl met daarop een Label en TextBox. In de UserControl heb ik hetvolgende staan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public partial class ATextBox : UserControl
{
    [Category("Appearance"), DefaultValue("Text"), Browsable(true),
        Bindable(true)]
    public new string Text
    {
        get { return this.textBox.Text; }
        set { this.textBox.Text = value; }
    }

    [Category("Appearance"), DefaultValue("Label"), Browsable(true),
        Bindable(true)]
    public string Caption
    {
        get { return this.label.Text; }
        set { this.label.Text = value; }
    }
}
Niet meer dan simpelweg het toewijzen en ophalen van de .Text properties van de TextBox resp. Label. Het 'new' keyword bij de Text property is om de default property van de UserControl te overriden. Dat heeft niets met dit probleem te maken.

Voor het Label werkt dit zoals verwacht, maar niet voor de TextBox. Vanuit de code werkt de TextBox correct, maar niet vanuit de Designer.

Stel dat ik de UserControl op een Form zet. Wanneer ik in Designer mode via de Properties grid van Visual Studio waardes invul bij Text en Caption voor de UserControl, dan zie ik beide waardes verschijnen in de voorbeeldweergave, maar niet in de code. Daar staat enkel de waarde van Caption. Wanneer ik de applicatie dan uitvoer is het Label wel ingevuld, maar de TextBox is leeg. Wanneer ik expliciet in de code zet userControl.Text = "blah", dan verschijnt het wel correct. Maar nooit langs de Designer View.

Hoe kan ik dit verhelpen?

#2

Een tweede puntje dat hier mogelijk aan vast hangt is de default waarde. Zoals je kan zien uit het codevoorbeeld geef ik default waardes mee. Wanneer ik de UserControl toevoeg aan m'n Form, dan krijgt het Label automatisch de default waarde, maar de TextBox krijgt als .Text de naam van de UserControl (bv "userControl"). Waarom wordt hier niet "Text" ingevuld zoals de default waarde suggereert?

Correctie: Ook het Label krijgt een verkeerde naam... Deze krijgt steeds de naam "label" ongeacht wat ik als default waarde opgeef. Binnen de UserControl noemt het Label eveneens "label". Blijkbaar werkt het zetten van default values iets anders.

Hoe controleer je het gedrag dat de default waarde de naam van de control wordt, of een opgegeven default naam?

[ Voor 9% gewijzigd door reyan op 01-06-2006 11:36 ]


Verwijderd

Net geprobeerd, en in VS2003 slaat 'ie de gewijzigde waarde voor Text niet op, of je nu "new" of "override" gebruikt. Maak je van die property bv. EditText, dan is er niks aan de hand.

Die DefaultValue attibute set overigens niet de value wanneer 't control wordt aangemaakt, dat zul je zelf in de constructor moeten doen. Die attribute zorgt er alleen maar voor dat, wanneer de property van je control die waarde heeft, deze niet wordt opgeslagen in je source.

Verwijderd

Het rare gedrag komt omdat in de designer niet jouw klasse wordt ingeladen, maar de baseklasse van jouw klasse(ik weet het niet echt zeker, tis alweer een tijdje geleden dat ik het uitgezocht heb), waarna er met wat parsing van InitializeComponent() en andere truuks de rest van je controls in de designer terecht komen.


zie ook hier

p.s. waarom gebruik je trouwens new en niet override voor het Text Property?

je override hem nu namelijk niet, maar je verbergt 'm, en dat geeft rare effecten als jouw control naar 1 van zijn baseklassen gecast , en dan Text gebruikt wordt
A declaration of a new member hides an inherited member only within the scope of the new member.
zie hier onderaan de pagina

[ Voor 65% gewijzigd door Verwijderd op 01-06-2006 20:00 ]


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 19-02 14:18

pjvandesande

GC.Collect(head);

Gebruik het DesignerSerializationVisibility attribute om er voor te zorgen dat de Designer ook code genereerd voor deze property.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Browsable(true)] 
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Category("Appearance"), DefaultValue("Text"), Browsable(true), Bindable(true)]
public new string Text
{
    get
    {
        return textBox.Text; 
    }
    set
    {
        textBox.Text = value;
    }
}

  • reyan
  • Registratie: November 2003
  • Laatst online: 17-12-2021
questa: Bedankt! Dat is inderdaad de oplossing. Het werkt nu wel naar behoren :)

ReSc: Je hebt gelijk. Een override zou hier beter op z'n plaats zijn.

Afterlife: Bedankt voor de informatie.