Ik vind die oplossing in dat sample niet zo mooi. Je kan met zo'n oplossing die 2de form niet gaan hergebruiken vanop een andere form dan form1.
Daarom zorg ik er altijd voor dat, bij communicatie tsn 2 forms het ene type form niets afweet van het andere type form.
Hoe ik dat doe:
Ik maak gebruik van functie-pointers (delegates in .NET). Ik zal even wat code posten hoe ik het doe in C#:
Stel, je hebt een form frmList en een form frmDetail. Vanuit frmList kan je een frmDetail form openen en op dat frmDetail-scherm geef je gegevens in, die je dan, na een druk op een knop wilt zien in frmList.
Wat je dus nodig hebt, is een delegate. Die definieer ik nu voor het gemak in frmList:
code:
1
2
3
4
5
6
7
8
9
| using System;
using System.Windows.Forms;
namespace ListForm
{
public delegate void MyDelegate(object Sender);
... |
In het detailscherm (frmDetail) heb ik een instance nodig van die delegate. Dus, daar komt volgende code:
code:
1
2
3
4
5
6
7
8
| namespace DetailForm
{
public class TfrmDetail : Form
{
...
internal MyDelegate DoAfterOk;
... |
Stel dat er een instance van TfrmDetail geopend wordt vanuit frmList dan komt daar volgende code:
code:
1
2
3
4
5
6
7
8
| private void OnOpenButtonClick(object sender, EventArgs e)
{
TfrmDetail frmDet;
frmDet = new TfrmDetail(this);
frmDet.DoAfterOk = new MyDelegate(GeefGegevensDoor);
frmDet.Show();
} |
Wat ik hier dus gedaan heb, is aan DoAfterOk (die een instance is van MyDelegate) een functie 'toegekend'. Deze functie moet ik natuurlijk nog uitwerken. Stel dat ik de gegevens die op het detailform staan, in een ListView wil terechtbrengen die zich in TfrmList bevindt. Daartoe moet ik een functie schrijven in TfrmList die aan de signature van de Delegate voldoet. (In dit geval: return-type = void en één parameter van het type object). Deze functie heet dus 'GeefGegevensDoor' (zie hierboven) en hier volgt de uitwerking:
code:
1
2
3
4
5
6
7
8
9
| private void GeefGegevensDoor(object Sender)
{
ListItem NewItem;
NewItem = new ListItem();
NewItem.Text = ((TfrmDetail)Sender).TextBox1.Text;
ListView1.Items.Add(NewItem);
} |
Het enige wat nog rest, is om die functie 'GeefGegevensDoor' uit te voeren. Dit moet gebeuren vanop het DetailScherm (TfrmDetail), maar daar kennen we natuurlijk die functie niet. Maar, we hebben ze wel aan de delegate gekoppeld die een member is van TfrmDetail, dus kunnen we die functie op die manier uitvoeren vanuit TfrmDetail:
code:
1
2
3
4
5
6
7
| private void OnOkButtonClick(object Sender, EventArgs e)
{
if (DoAfterOk != null)
{
DoAfterOk(this);
}
} |
Zo, ik hoop dat het een beetje verstaanbaar is. Het spreekt ook voor zich dat ik hier enkel de relevante code gepost heb. Ik heb die code hier trouwens uit de losse pols getyped, dus zullen er wel syntax - fouten ed in zitten.
Zo, als dat geen voorgekauwde oplossing is...