[C#] Event based on string change

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 15-08 13:07
Na lang zoeken heb ik helaas het antwoord op de vraag zoals gesteld in de titel nog niet gevonden. Ik heb hier een string of een int, net wat het beste past en daar wil ik een eventhandler aan hangen.

C#:
1
2
3
String woordjes;

//Event welke getriggerd word op het moment dat woordjes veranderd


Bij een textbox zou er dan zoiets als het volgende gedefinieerd moeten worden:

C#:
1
2
3
List.Changed += new ChangedEventHandler(ListChanged);
// of
this.CF_createButton("ADDSET3", TranslateText("ADDSET3"), new MouseEventHandler(ADDSET3_Click), new MouseEventHandler(ADDSET3_Down));


Nu zoek ik een functie waarmee ditzelfde kan worden gedefinieerd voor een String of een Int. Echter kan ik hiervoor niks "standaards" vinden. Komt dit doordat dit zelf geschreven moet worden, of dat ik niet in de juiste hoek aan het zoeken ben.

Wat ik zoek is een event die fired op het moment dat een string of indien een int gekozen word afgaat zonder deze functie specifiek aan te roepen.

Acties:
  • 0 Henk 'm!

  • Storme
  • Registratie: December 2004
  • Laatst online: 18-06 16:41
Wel, wat je moet doen is een property maken van je string, daarin kun je dan het event raisen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private String _woordjes;
public event EventHandler WoordjesChanged;

protected virtual void OnWoordjesChanged() {
if (WoordjesChanged != null){ // wanneer niemand op dit event luistert is het null
WoordjesChanged(this,EventArgs.Empty);
}
}

public String Woordjes {
get { return _woordjes;}
set { _woordjes = value;
       OnWoordjesChanged()}
}

Acties:
  • 0 Henk 'm!

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 15-08 13:07
Dit betekent dat mijn event dus na de if statement moet plaats vinden:

C#:
1
2
3
4
5
6
7
8
protected virtual void OnWoordjesChanged()
        {
            if (WoordjesChanged != null)
            { // wanneer niemand op dit event luistert is het null 
                WoordjesChanged(this, EventArgs.Empty);
            }
            MessageBox.Show("Testing123");
        }

Acties:
  • 0 Henk 'm!

  • akooi
  • Registratie: December 2000
  • Laatst online: 02:49
Alleen heb je nu toch een WoordjesSet eventhandler en niet noodzakelijk een WoordjesChanged eventhandler...

Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Storme schreef op zondag 12 april 2009 @ 16:00:
Wel, wat je moet doen is een property maken van je string, daarin kun je dan het event raisen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private String _woordjes;
public event EventHandler WoordjesChanged;

protected virtual void OnWoordjesChanged() {
if (WoordjesChanged != null){ // wanneer niemand op dit event luistert is het null
WoordjesChanged(this,EventArgs.Empty);
}
}

public String Woordjes {
get { return _woordjes;}
set { _woordjes = value;
       OnWoordjesChanged()}
}
Dat gaat inderdaad wel werken. Afhankelijk van hoe TS dat wil moet er misschien nog wel een check in of de huidige niet hetzelfde is als de nieuwe en als dat wel zo is of je dan wel een event wil raisen.

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • BSeB
  • Registratie: Juni 2001
  • Laatst online: 15-08 13:07
Geen idee of ik het zo goed gedaan heb, maar volgens mij moet ik zo de if statement erin zetten om te checken of de Sting veranderd is, is dit niet het geval, dan gebeurd er niks en word de event niet aangeroepen!

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public String Woordjes
        {
            get { return _woordjes; }
            if (_woordjes == Woordjes)
            {
                //Do nothing
            }
            else
            {
                set { _woordjes = value;
                OnWoordjesChanged();}
            }
        }


Kan iemand me vertellen waarom die liggende _ is, heb het nog niet in de help kunnen vinden, omdat ik niet weet hoe het heet!

(Reply duurde wat langer door een vakantie)

Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 17:16

BM

Moderator Spielerij
BSeB schreef op donderdag 23 april 2009 @ 08:12:
Geen idee of ik het zo goed gedaan heb, maar volgens mij moet ik zo de if statement erin zetten om te checken of de Sting veranderd is, is dit niet het geval, dan gebeurd er niks en word de event niet aangeroepen!

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public String Woordjes
        {
            get { return _woordjes; }
            if (_woordjes == Woordjes)
            {
                //Do nothing
            }
            else
            {
                set { _woordjes = value;
                OnWoordjesChanged();}
            }
        }


Kan iemand me vertellen waarom die liggende _ is, heb het nog niet in de help kunnen vinden, omdat ik niet weet hoe het heet!

(Reply duurde wat langer door een vakantie)
Die liggende _ (een underscore ;)) is opzich niet nodig :) Sommige mensen gebruiken die om aan te geven dat het class variabelen zijn. In principe kun je dat gewoon weglaten, werkt niet zo goed :)

Volgens mij gaat dat wat je nu geschreven hebt niet werken, volgens mij is dit meer wat je zoekt:

C#:
1
2
3
4
5
6
7
8
9
10
11
public String Woordjes
        {
            set
            { 
                if (!_woordjes.Equals(value))
                {
                     _woordjes = value;
                     OnWoordjesChanged();
                 }
            }
        }

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

De == gaat weldegelijk werken. Het is C#, geen Java. Strings worden gewoon by value vergeleken :). Het lege blok code in de true case van de if is dan wel weer een beetje zinloos idd, draai dan gewoon de conditie om ;)

.edit: ah, dat is niet het enige wat je gewijzigd hebt. Idd, hij moet vergelijken met value, niet met Woordjes :). Maar of je een == of Equals doet is om het even.

[ Voor 48% gewijzigd door .oisyn op 23-04-2009 13:28 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

.oisyn schreef op donderdag 23 april 2009 @ 12:37:
De == gaat weldegelijk werken. Het is C#, geen Java. Strings worden gewoon by value vergeleken :). Het lege blok code in de true case van de if is dan wel weer een beetje zinloos idd, draai dan gewoon de conditie om ;)
== gaat inderdaad wel werken maar Equals wordt aangeraden om te gebruiken. Maar zoals de set daar geschreven is gaat niet werken volgens mij, die van BM werkt zeker.

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Phyxion schreef op donderdag 23 april 2009 @ 12:42:
[...]

== gaat inderdaad wel werken maar Equals wordt aangeraden om te gebruiken.
Euh; dat zou ik als ik jou was even nuanceren..

[ Voor 9% gewijzigd door RobIII op 23-04-2009 12:47 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

When you compare strings, you should use the methods that explicitly specify what kind of comparison you intend to perform. [...] It is best to avoid using the == and != operators when you compare strings. Also, avoid using the String.CompareTo instance methods because none of the overloads takes a StringComparison.
Ik snap niet helemaal waarom dat is als het enige wat je wilt doen een binary comparison is. Oftewel, dan volstaat de == prima. Desalniettemin, om dezelfde reden voldoet Equals() zonder StringComparison argument ook niet, dus wat dat betreft is wat Phyxion zegt ook niet waar.
Phyxion schreef op donderdag 23 april 2009 @ 12:42:
Maar zoals de set daar geschreven is gaat niet werken volgens mij, die van BM werkt zeker.
Ah ja, dat was me nog niet eens opgevallen :). Hij vergelijkt nu _woordjes met Woordjes, terwijl de property Woordjes juist weer _woordjes returnt, dus er staat gewoon: if (_woordjes == _woordjes). Handig :P. Je moet idd met 'value' vergelijken.

[ Voor 40% gewijzigd door .oisyn op 23-04-2009 13:31 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
RobIII schreef op donderdag 23 april 2009 @ 12:44:
[...]

Euh; dat zou ik als ik jou was even nuanceren..
Mwa waarom? In C# worden operators geoverload, de string variant van "==" is in C# geoverload met stringa.Equals(stringb, Stringcomparision.Ordinal) dus exact het zelfde als hoe je het anders zou doen, pas als je cultural dependent wilt doen of case wil ignoren hoef je iets anders te gebruiken dan ==.

edit: damn moet eerder refreshen, .Oisyn was me weer voor.
* roy-t zwaait naar .Oisyn *O*

[ Voor 8% gewijzigd door roy-t op 23-04-2009 13:31 ]

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

.oisyn schreef op donderdag 23 april 2009 @ 13:24:
[...]

Ik snap niet helemaal waarom dat is als het enige wat je wilt doen een binary comparison is. Oftewel, dan volstaat de == prima. Desalniettemin, om dezelfde reden voldoet Equals() zonder StringComparison argument ook niet, dus wat dat betreft is wat Phyxion zegt ook niet waar.


[...]

Ah ja, dat was me nog niet eens opgevallen :). Hij vergelijkt nu _woordjes met Woordjes, terwijl de property Woordjes juist weer _woordjes returnt, dus er staat gewoon: if (_woordjes == _woordjes). Handig :P. Je moet idd met 'value' vergelijken.
Precies wat daar staat. Als je String.Equals gebruikt met een string weet je sowieso dat de compare tussen string en string gaat.

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Daarom zeg ik ook dat 'ie even moet nuanceren ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Phyxion schreef op donderdag 23 april 2009 @ 13:33:
[...]

Precies wat daar staat. Als je String.Equals gebruikt met een string weet je sowieso dat de compare tussen string en string gaat.
Dat weet je met == ook.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 17:16

BM

Moderator Spielerij
Het was niet mijn bedoeling een discussie te ontketenen wat nu beter is, == of .Equals. Het ging me voornamelijk om de foutieve wijze waar de set geimplementeerd was. Dat .Equals heb ik er neer gezet omdat ik dat zelf meestal gebruik :)

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
RobIII schreef op donderdag 23 april 2009 @ 13:34:
[...]

Daarom zeg ik ook dat 'ie even moet nuanceren ;)
Doh, ik interpreteerde dat je de andere kant op 'nuanceerde.' Mijn fout we zijn het dus harstikke eens (tsja dat ben ik niet gewend van mensen :P )

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

Verwijderd

Is dit soort functionaliteit niet veel beter in een aparte klasse onder te brengen? Ik weet uit m'n hoofd niet of het kan, maar je zou bijvoorbeeld een klasse kunnen maken die overerft van String, en dan je = operator overloaden o.i.d. (en alle andere operators/methods die je string aanpassen.
Een andere, misschien veiligere aanpak zou zijn om een wrapper klasse om je string te bouwen die de events regelt. Moet je alleen even uitzoeken welke operators/methods je wil bieden vanuit deze wrapper ;-)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je kunt een string niet aanpassen (hij is immutable), dus wat jij suggereert gaat sowieso niet werken (buiten het feit dat de String klasse sealed is ;)).

Desalniettemin kun je natuurlijk weldegelijk een (generic) wrapper maken die een event raised bij een verandering. Dit is echter zoiets basaals dat ik me eigenlijk afvraag of dat niet al bestaat in .Net :)

[ Voor 45% gewijzigd door .oisyn op 23-04-2009 16:45 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op donderdag 23 april 2009 @ 15:59:
Is dit soort functionaliteit niet veel beter in een aparte klasse onder te brengen? Ik weet uit m'n hoofd niet of het kan, maar je zou bijvoorbeeld een klasse kunnen maken die overerft van String, en dan je = operator overloaden o.i.d. (en alle andere operators/methods die je string aanpassen.
Zoals .oisyn al zegt kun je string niet overidden omdat het een sealed class is. Ook de assignment operator kun je niet overiden in C# dus dat gaat niet lukken.
.oisyn schreef op donderdag 23 april 2009 @ 16:05:
Desalniettemin kun je natuurlijk weldegelijk een (generic) wrapper maken die een event raised bij een verandering. Dit is echter zoiets basaals dat ik me eigenlijk afvraag of dat niet al bestaat in .Net :)
Volgens mij is er niet een standaard wrapper die dit voor je doet. Er is wel de INotifyPropertyChanged interface die een event defineert voor wijzigende properties.

Maar je zou inderdaad iets als het volgende kunnen gebruiken
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
26
27
28
29
30
31
32
public class NotifyObject<T>
{
    private T val;

    public event EventHandler ValueChanged;

    public NotifyObject(T val)
    {
        this.val = val;
    }

    public T Value
    {
        get { return val; }
        set
        {
            if (val == null  || val.Equals(value))
            {
                OnValueChanged();
                val = value;
            }
        }
    }

    protected virtual void OnValueChanged()
    {
        if(ValueChanged!=null)
        {
            ValueChanged(this, EventArgs.Empty);
        }
    }
}

[ Voor 24% gewijzigd door Woy op 23-04-2009 16:51 ]

“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.”

Pagina: 1