[C#] Eventhandlers toewijzen aan toegevoegde controls

Pagina: 1
Acties:

  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Ik heb volgende (sterk vereenvoudigde) code om een invoervak + label aan m'n form toe te voegen (het idee hierachter is dat wanneer een invoervak ingevuld wordt er meteen een nieuw invoervak verschijnt op een nieuwe regel):

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void addNumericInput(int iIdentifier, int x, int y, int iLabelWidth) 
{
    int iTextBoxWidth = 70;
    
    // Create a new Label control.
    Label label = new Label();
    label.Size = new Size(iLabelWidth, 16);
    label.Location = new Point(x, y);
    label.Name = "label" + iIdentifier.ToString();

    // Create a new TextBox control.
    TextBox textBox = new TextBox();
    textBox.Size = new Size(iTextBoxWidth, 21);
    textBox.Location = new Point(x + iLabelWidth + 10, y);
    textBox.Name = "textBox" + iIdentifier.ToString();

    // Add the controls to the form's control collection.
    this.Controls.Add(label);
    this.Controls.Add(textBox);
}
...
    addNumericInput(5, 100, 90, 70);
...
Dit werkt zoals verwacht. Maar natuurlijk moeten de zo toegevoegde controls niet gewoon wat ruimte innemen op het scherm - ze moeten ook iets doen. Dus moeten er event handlers aan gekoppeld worden. Maar ik krijg er kop noch staart aan hoe ik dit voor elkaar krijg. De documentatie schrijft over ControlEventHandler, maar hoe ik dat ook toepas, het ding weigert te compileren.

Iemand die me kan zeggen wat en waar ik moet toevoegen om bijvoorbeeld een TextChanged event toe te voegen aan de textboxen?


En dan had ik nog een tweede vraagje... Is het mogelijk om een variabele te initialiseren en aan te roepen via een string of iets dergelijks? Bijvoorbeeld elke textBox control van hierboven moet ook gelinkt worden aan een struct waarin de waardes en bewerkingen afgehandeld worden. Die zullen dan ook tijdens run-time geïnitialiseerd moeten worden. Hoe doe je dat en hoe kun je zoiets dan oproepen? Het zou makkelijk zijn wanneer dat via een string kon gaan. Bijvoorbeeld "textBoxValue" + index.ToString().

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:24
code:
1
2
3
4
5
6
txtMessage.TextChanged += new System.EventHandler(txtMessage_TextChanged);

private void txtMessage_TextChanged(object sender, System.EventArgs e)
{
  // Handle event
}
Het zou makkelijk zijn wanneer dat via een string kon gaan. Bijvoorbeeld "textBoxValue" + index.ToString().
Misschien kan je hier beter het "Tag" attribuut voor gebruiken?

[ Voor 34% gewijzigd door sig69 op 11-05-2005 13:52 ]

Roomba E5 te koop


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Bedankt! System.EventHandler was inderdaad hetgene dat ik zocht. Ik was wat op het verkeerde spoor geraakt door ControlEventHandler.

Tag? Maar dat werkt alleen op formonderdelen en dergelijke, niet? Ik zou gewoon een struct willen toewijzen aan een variabele aan de hand van een soort index. Vergelijk het met een array (maar dan met structs als waarden). Of zou ik daar een System.Collections.ArrayList voor kunnen gebruiken? Moet ik sebiet eens proberen.

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:28

mulder

ik spuug op het trottoir

Een custom Textbox maken (overerven van TextBox)

oogjes open, snaveltjes dicht


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

mahi schreef op woensdag 11 mei 2005 @ 14:01:
Bedankt! System.EventHandler was inderdaad hetgene dat ik zocht. Ik was wat op het verkeerde spoor geraakt door ControlEventHandler.

Tag? Maar dat werkt alleen op formonderdelen en dergelijke, niet? Ik zou gewoon een struct willen toewijzen aan een variabele aan de hand van een soort index. Vergelijk het met een array (maar dan met structs als waarden). Of zou ik daar een System.Collections.ArrayList voor kunnen gebruiken? Moet ik sebiet eens proberen.
Kijk is naar een HashTable.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:28

mulder

ik spuug op het trottoir

Wat wil je precies doen dan? Wat ik begreep dat je aan een textbox extra informatie en functionaliteit wilt hangen?

oogjes open, snaveltjes dicht


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Don Facundo: Dat is wat ik nu inderdaad nodig heb, en ik ben momenteel al bezig met een overgeërfde TextBox. Het werkt nog niet allemaal, maar ik kom er wel uit.

Maar ik vroeg me gewoon af of je variabelen ook via een string of iets dergelijks kunt benaderen.

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Zo kun je iets opslaan in je tag.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public struct MyStruct
{
   public int MyInt;
   public string MyString;

   public MyStruct(int myInt, string myString)
   {
      MyInt = myInt;
      MyString = myString;
   }
}

...

TextBox myTextBox = new TextBox();
myTextBox.Tag = new MyStruct(5, "a string");

...

MyStruct myStruct = (MyStruct)myTextBox.Tag;

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
mahi schreef op woensdag 11 mei 2005 @ 15:53:
Don Facundo: Dat is wat ik nu inderdaad nodig heb, en ik ben momenteel al bezig met een overgeërfde TextBox. Het werkt nog niet allemaal, maar ik kom er wel uit.

Maar ik vroeg me gewoon af of je variabelen ook via een string of iets dergelijks kunt benaderen.
Nee dat is niet mogenlijk om variabelen te benaderen via een string. Een variabele is niet meer als een naampje die de compiler uiteindelijk naar een adres compileert. Als je dynamisch controls toevoegt en die wil je op naam gebruiken kan je hier een HashTable voor gebruiken en als je op index wilt selecteren kan je hier bijvoorbeeld een Array of ArrayList voor gebruiken.

Nou klopt dit niet helemaal want via reflection kun je alsnog dingen van een object aanroepen via de namen, maar dit is meestal niet wat je wilt doen aangezien het een aardige performance inpact kan hebben.

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


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Nou ja, jammer. Toch alleszins iedereen al bedankt voor jullie input. Ik ben al een heel eind verder :)

Ik heb toch nog een detailvraagje dat aanleunt bij m'n eerdere vraag (jaja, veel vragen - php-programmeur die hopeloos verdwaalt in de obscure wereld van C# :)).

Hoe kan ik zien door welke control een bepaalde eventhandler veroorzaakt werd? Bijvoorbeeld in m'n originele vraag maak ik tijdens runtime invoervakken aan die allemaal dezelfde functie aanroepen via de TextChanged eventhandler. Maar de gegevens die ingevoerd worden moeten wel op de juiste plaats in de database terecht komen, dus ik moet weten welk invoervak de TextChanged heeft veroorzaakt.
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
private void addNumericInput(int iIdentifier, int x, int y)  
{ 
    int iTextBoxWidth = 70; 
     
    // Create a new TextBox control. 
    TextBox textBox = new TextBox(); 
    textBox.Size = new Size(iTextBoxWidth, 21); 
    textBox.Location = new Point(x, y); 
    textBox.Name = "textBox" + iIdentifier.ToString();

    // Add eventhandlers
    textBox.TextChanged += new System.EventHandler(textBox_TextChanged);

    // Add the controls to the form's control collection. 
    this.Controls.Add(textBox); 
} 
... 
    addNumericInput(1, 100, 90);
    addNumericInput(2, 100, 120);
    addNumericInput(2, 100, 150);
...
private void textBox_TextChanged(object sender, System.EventArgs e)
{
    // Hoe weet ik hier welke van de drie textboxen de eventhandler
    // veroorzaakte? Je zou verwachten dat dit in het sender object
    // te vinden is, maar daaruit kan ik blijkbaar enkel afleiden dat
    // een textbox (geen idee welke) de eventhandler veroorzaakte.
}

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:28

mulder

ik spuug op het trottoir

Lees eens de parameters die het event mee krijgt eens hard op, en je weet wat casten is?

[ Voor 13% gewijzigd door mulder op 12-05-2005 09:57 ]

oogjes open, snaveltjes dicht


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:11
code:
1
2
3
Textbox t = sender as Textbox;

if( t == null ) throw new InvalidOperationException ("sender is not a textbox.");


Misschien handig als je er eens een goed boek bijpakt ?

https://fgheysels.github.io/


  • mahi
  • Registratie: Juni 2001
  • Laatst online: 03-10-2025

mahi

God bless GoT

Topicstarter
Wel, ik heb hier naast me liggen "Visual C# .NET - Step By Step", "Visual C# .NET - Core Reference", "A Programmer's Guide To ADO.NET in C#" en "TCP/IP Sockets in C# .NET"... Ik zou zo denken toch genoeg lectuur om mee te beginnen... En toch lukt het niet :( (nou ja, ik heb al aardig wat werkende code geschreven, maar het zijn zo de details als deze vragen). De voorbeelden in Step By Step zijn zo simplistisch of rond één bepaald concept dat ze nauwelijks praktische waarde hebben. De Core Reference is wel lekker uitgebreid, maar je moet weten naar wat je zoekt eer je het kunt vinden... En dat is mijn grootste probleem: Ik weet niet waarop ik moet zoeken.

Misschien dat jullie betere boeken kunnen aanraden?

Hoe dan ook, bedankt weer voor jullie input. Ik ga weer eens aan de slag met deze nieuwe kennis! :)

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

mahi schreef op donderdag 12 mei 2005 @ 10:21:
Wel, ik heb hier naast me liggen "Visual C# .NET - Step By Step", "Visual C# .NET - Core Reference", "A Programmer's Guide To ADO.NET in C#" en "TCP/IP Sockets in C# .NET"... Ik zou zo denken toch genoeg lectuur om mee te beginnen... En toch lukt het niet :( (nou ja, ik heb al aardig wat werkende code geschreven, maar het zijn zo de details als deze vragen). De voorbeelden in Step By Step zijn zo simplistisch of rond één bepaald concept dat ze nauwelijks praktische waarde hebben. De Core Reference is wel lekker uitgebreid, maar je moet weten naar wat je zoekt eer je het kunt vinden... En dat is mijn grootste probleem: Ik weet niet waarop ik moet zoeken.

Misschien dat jullie betere boeken kunnen aanraden?

Hoe dan ook, bedankt weer voor jullie input. Ik ga weer eens aan de slag met deze nieuwe kennis! :)
Lees ze gewoon allemaal door, begin bij de Step By Step boeken. Met die boeken die je hebt liggen moet je een aardig eind komen. Alleen het kost even tijd, maar begin zeker met de Step By Step.
Pagina: 1