[C#] tekst invoegen bij text-cursor

Pagina: 1
Acties:
  • 466 views sinds 30-01-2008
  • Reageer

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
Ik ben bezig met een winforms applicatie waarbij de gebruiker eenvoudig het Euro teken moet kunnen invoeren. (dat gedoe met alt werkt niet zo soepel).
Nu had ik het idee om dit Euro teken in te voegen op de plaats waar de cursor staat als er op een button wordt geklikt. het is echter iets lastiger als ik had gedacht.

Om te testen heb ik een button en 2 textboxen. Deze code zit onder de button:
C#:
1
2
3
4
5
6
7
8
9
if (this.ActiveControl != null)
{
        for(int i=0; i < this.Controls.Count; i++)
    {
        string ControlName = this.Controls[i].Name.ToString();
        bool ControlHasFocus = this.Controls[i].ContainsFocus;
        MessageBox.Show("De focus van " + ControlName + " = " + ControlHasFocus.ToString());
    }
}           

ik probeer allerlei dingen met focus en active en weet ik veel wat. Maar elke keer als ik op de button klik, krijgt deze de focus... duh
Maar hoe bepaal ik nu de control waar de text cursor in staat/stond?

heb ook gegoogeld en gezocht op got, maar kan niet de juiste combi zoektermen vinden waarmee ik relevante topics krijg.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

Maar de TextBox.SelectionIndex en TextBox.SelectionCount, blijven wel geset. Dus deze kun je gewoon nog achterhalen.

Ik zou een inputcontrol_LostFocus event maken waar je al je TextBox'n aan wired en in dat event store jij gewoon de laatste control.

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
questa schreef op dinsdag 27 september 2005 @ 16:12:
Maar de TextBox.SelectionIndex en TextBox.SelectionCount, blijven wel geset. Dus deze kun je gewoon nog achterhalen.

Ik zou een inputcontrol_LostFocus event maken waar je al je TextBox'n aan wired en in dat event store jij gewoon de laatste control.
Ik vind bijzonder weinig over die SelectionIndex en SelectionCount. :?

En om die laatste control te storen, zal ik dus wel een afgeleide classe van textbox moeten maken, waar ik vervolgens dat event aan wire.
Kan zo snel even niets anders bedenken.... En het moet natuurlijk ook werken voor 100 bestaande textboxen en zelfs nieuwe textboxen.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je hoeft toch geen afgeleide classe daarvoor te maken. Je kan toch gewoon bij het toevoegen van een textbox het event toevoegen.

even een simpel voorbeeldje
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyForm : Form
{
    public void AddControl( Control c )
    {
        if( c is TextBox )
            c.LostFocus +=new EventHandler(MyLostFocus);
    }

    private void MyLostFocus(object sender, EventArgs e)
    {
        //Doe je ding
    }
}

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
rwb schreef op dinsdag 27 september 2005 @ 16:31:
Je hoeft toch geen afgeleide classe daarvoor te maken. Je kan toch gewoon bij het toevoegen van een textbox het event toevoegen...
Dus dan moet ik dit aanpassen voor al mijn reeds bestaande textboxen, en dit doorgeven aan de andere developers voor het plaatsen van nieuwe textboxen?!
Is AddControl( ) trouwens een standaard functie? Wordt deze uitgevoerd op het moment dat ik een textbox toevoeg op het form? Zie hem niet in msdn staan...

Het lijkt me dus niet zo nette en praktische oplossing. Het kan dus sowieso niet met alleen maar code toe te voegen onder die knop? dat zou natuurlijk mooi zijn.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

CaptBiele schreef op dinsdag 27 september 2005 @ 16:22:
[...]


Ik vind bijzonder weinig over die SelectionIndex en SelectionCount. :?
TextBox.SelectionStart
TextBox.SelectionLength

Daarmee kun je de Caret positie bepalen.
CaptBiele schreef op dinsdag 27 september 2005 @ 16:55:
[...]

Dus dan moet ik dit aanpassen voor al mijn reeds bestaande textboxen, en dit doorgeven aan de andere developers voor het plaatsen van nieuwe textboxen?!
Nee, een TextBox heeft al een LostFocus event.
Is AddControl( ) trouwens een standaard functie? Wordt deze uitgevoerd op het moment dat ik een textbox toevoeg op het form? Zie hem niet in msdn staan...
Nee, een form heeft wel een ControlAdded event oid.
Het lijkt me dus niet zo nette en praktische oplossing. Het kan dus sowieso niet met alleen maar code toe te voegen onder die knop? dat zou natuurlijk mooi zijn.
Nope.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
questa schreef op dinsdag 27 september 2005 @ 17:01:
[...]
Nee, een form heeft wel een ControlAdded event oid.
Die is inderdaad nog handiger te gebruiken dan kan je iets dergelijks doen
C#:
1
2
3
4
5
private void Form_ControlAdded(object sender, ControlEventArgs e)
{
    if( e.Control is TextBox )
        e.Control.LostFocus += new EventHandler(MyLostFocus);
}

en dan die registreren voor het ControlAdded event van je Form. Dan hoef je niks te veranderen aan het toevoegen van je textboxen. Als je dat dan ook nog op meerdere forms zou willen gebruiken zou je een Subclass van Form kunnen maken waar die code al in zit

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
ja dat Form_ControlAdded event is een stuk handiger. Daar doelde ik ook op.

Maar ik moet dan toch nog steeds de LostFocus() implementeren van de reeds bestaande textboxen?
Ik ga er vanavond even mee aan de slag, offline welteverstaan. Morgen zal ik weer reageren.

tnx alvast

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

CaptBiele schreef op dinsdag 27 september 2005 @ 17:28:
ja dat Form_ControlAdded event is een stuk handiger. Daar doelde ik ook op.

Maar ik moet dan toch nog steeds de LostFocus() implementeren van de reeds bestaande textboxen?
Ik ga er vanavond even mee aan de slag, offline welteverstaan. Morgen zal ik weer reageren.

tnx alvast
Gewoon een private membertje _textBoxLastFocused en in het textbox_LostFocusEvent pak je de sender, cast deze naar een textbox en werpt deze in de _textBoxLastFocused.

edit
Ik kon het niet laten om even code erbij te tikken.

C#:
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
private void Form_ControlAdded( object sender, ControlEventArgs e ) 
{ 
    if( e.Control is TextBox ) 
    {
        e.Control.LostFocus += new EventHandler(TextBox_LostFocus); 
    }
}

private void TextBox_LostFocus( object sender, EventArgs e )
{
    TextBox textBox = sender as TextBox;
    
    if( textBox != null )
    {
        _textBoxLastFocus = textBox;
    }
}

private void cmdInsertEuro_Click( object sender, EventArgs e )
{
    if( _textBoxLastFocus != null )
    {
        textBox.Text = textBox.Text.Insert( textBox.SelectionStart, "€" );
    }
}

[ Voor 36% gewijzigd door pjvandesande op 27-09-2005 19:57 ]


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
Ik kan het nu aan de praat krijgen voor alle textboxen. De code is nog redelijk eenvoudig (achteraf gezien)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
private void InsertEuroButton_Click(object sender, System.EventArgs e)
{
    if (_textBoxLastFocus != null )
        _textBoxLastFocus.Text = _textBoxLastFocus.Text.Insert( _textBoxLastFocus.SelectionStart, "€" );
}

private void textBox_LostFocus(object sender, EventArgs e)
{
    TextBox textBox = sender as TextBox;

    if( textBox != null )
        _textBoxLastFocus = textBox;
}

Maar nu moet ik dus aan elke textbox het event wiren aan LostFocus. Nu dacht ik eraan dat het Euro teken niet overal nodig is, zoals bij het invoeren van naw gegevens.
Het zou helemaal mooi zijn als ik alleen het event wire van de textboxen waarbij het Euro teken ingevoerd kan worden.
Volgens mij kan ik het dan niet alleen af met de LostFocus. Als ik dan namelijk naar een textbox ga zonder LostFocus, is _textBoxLastFocus nog steeds gevuld. En om deze variabele "te legen" zal ik toch LostFocus voor alle textboxen moeten wiren. Agree?

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

CaptBiele schreef op woensdag 28 september 2005 @ 10:14:
Volgens mij kan ik het dan niet alleen af met de LostFocus. Als ik dan namelijk naar een textbox ga zonder LostFocus, is _textBoxLastFocus nog steeds gevuld. En om deze variabele "te legen" zal ik toch LostFocus voor alle textboxen moeten wiren. Agree?
Gewoon alleen de TextBoxen wiren die nodig zijn :?

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
questa schreef op woensdag 28 september 2005 @ 10:29:
Gewoon alleen de TextBoxen wiren die nodig zijn :?
Dat werkt dus niet. Als ik dan in een textbox ziet waar het euro teken niet ingevoerd kan worden, en ik klik op de button, komt het euro teken nog in de vorige textbox (variabele met laatste textbox is nog steeds gevuld).

Ik heb het nu anders opgelost:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void button1_Click(object sender, System.EventArgs e)
{
    if (_textBoxLastFocus != null )
        _textBoxLastFocus.Text = _textBoxLastFocus.Text.Insert( _textBoxLastFocus.SelectionStart, "€" );
}

private void textBox_EnterY(object sender, EventArgs e)
{
    this.button1.Enabled = true;

    TextBox textBox = sender as TextBox;

    if( textBox != null )
        _textBoxLastFocus = textBox;
}

private void textBox_EnterN(object sender, EventArgs e)
{
    this.button1.Enabled = false;
}


Ik gebruik Enter het event ipv het LostFocus. Nu is de knop ook disabled als er geen euro teken ingevoerd hoeft te worden. Dus ik wire EnterY of EnterN, al naar gelang ik wel of geen euro teken in dat veld wil invoeren.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

Je moet niet alle TextBoxen aan het LostFocus event wiren.

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
questa schreef op woensdag 28 september 2005 @ 11:01:
Je moet niet alle TextBoxen aan het LostFocus event wiren.
wel :)

stel ik heb textbox1 waar wel euros in mogen. En textbox2 waar het niet in mag.
Ik ga naar textbox1 en klik op de knop. Er verschijnt mooi een euro teken in textbox1.
Nu ga ik naar textbox2 en klik weer op de knop. Nu verschijnt er weer een euro teken in textbox1.
En het is mooier om de knop te disablen als deze niet gebruikt kan worden. Dus dan moet ik deze wel aan alle textboxen wiren........

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 11:13

pjvandesande

GC.Collect(head);

Ja, ik dacht dat jij hem sowieso al gedisabled had als het niet gebruikt kon worden.

Het LostFocus event van een Textbox waar geen Euro teken in mag heeft namelijk geen nut.
Dan werkt het Enter event inderdaad prima.

[ Voor 12% gewijzigd door pjvandesande op 28-09-2005 11:59 ]


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
questa schreef op woensdag 28 september 2005 @ 11:59:
Ja, ik dacht dat jij hem sowieso al gedisabled had als het niet gebruikt kon worden.

Het LostFocus event van een Textbox waar geen Euro teken in mag heeft namelijk geen nut.
Dan werkt het Enter event inderdaad prima.
Mooi, dan zijn we het daar over eens! Anyway, tnx nog voor je uitleg. :D
Pagina: 1