[C#] Functie aanroepen in scherm a na sluiten scherm b

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 267161

Topicstarter
Beste Tweakers,

Ik heb nu mijn eerste tool gebouwd en dit is een goed succes. Heb nu een configuratiescherm gemaakt en loop tegen het volgende aan:

Ik wil na het opslaan van de gegevens een bepaalde functie in het hoofdvenster opnieuw uitvoeren. Dit lukt mij niet.

Ik heb gezocht op dit onderwerp op tweakers en daarna google en ik kwam voorbeelden tegen (in bijv. c++) met de naam callback pointer (?). De code voorbeelden en uitleg erbij gingen mijn pet te boven en gaf me ook het gevoel dat het niet is wat ik zoek.

Wat ik aan u vraag is een simpele methode om ervoor te zorgen dat ik, net voor/na het sluiten van Scherm B (vanuit scherm A), een functie aanroep die zich bevindt in Scherm A.

Ik heb tevens het volgende gedaan in Scherm B:
this.Close();
application.Restart();

Maar dit gaf me een leuke error.
"Object reference not set to an instance of an object."

Ik hoop van u te mogen horen hoe ik dit kan bereiken, of wellicht heeft u goede leesvoer voor mij.
Bij voorbaat dank!

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Wat ik aan u vraag is een simpele methode om ervoor te zorgen dat ik, net voor/na het sluiten van Scherm B (vanuit scherm A), een functie aanroep die zich bevindt in Scherm A.
Waarom zou je UI-code van een ander formulier willen aanroepen? Daar zit toch alleen muis- en toetsenbordafhandellogica in, en de echte code die de applicatie vormt bevindt zich toch zeker in de Business Layer? ;)

Wikipedia: Model-view-controller-model

https://oneerlijkewoz.nl
Het ergste moet nog komen / Het leven is een straf / Een uitgestrekte kwelling van de wieg tot aan het graf


Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 21:56
Je zou kunnen kijken naar custom events (ff googlen) die je dan vanuit scherm B aanroept en een eventhandler in scherm A heeft. Eventuele data kan je dan via eventarguments mee sturen.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Je hebt een bepaalde actie in Form A. In die actie maak je form B aan.

Je hangt aan form B een WindowClosedEventHandler, en daarin kan je die actie die je wil uitvoeren.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void SomeMethod()
{
   var formB = new FormB();


   // dit
   formB.Closed += (sender, eventArgs) => { /* hier komt de functie die je wilt uitvoeren */ }; 

   // of dit
   formB.Closed += new EventHandler(FormB_Closed);

   formB.ShowDialog(); 
}

// dit hoort bij de 2de optie
private void FormB_Closed(object sender, EventArgs e)
{
   // hier je methode 
}

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

Anoniem: 267161

Topicstarter
Snake schreef op vrijdag 28 mei 2010 @ 13:24:
Je hebt een bepaalde actie in Form A. In die actie maak je form B aan.

Je hangt aan form B een WindowClosedEventHandler, en daarin kan je die actie die je wil uitvoeren.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void SomeMethod()
{
   var formB = new FormB();


   // dit
   formB.Closed += (sender, eventArgs) => { /* hier komt de functie die je wilt uitvoeren */ }; 

   // of dit
   formB.Closed += new EventHandler(FormB_Closed);

   formB.ShowDialog(); 
}

// dit hoort bij de 2de optie
private void FormB_Closed(object sender, EventArgs e)
{
   // hier je methode 
}
toon volledige bericht
Dit is precies wat ik zocht! Ik heb het nog niet toegepast maar ik snap je code, ziet er erg logisch en makkelijk uit! Ik loop er nu tegen aan dat de object reference foutmelding ergens anders vandaan kom dus ben eerst dat aan het oplossen, daarna is het enkel nog jou code toepassen en dan is het klaar.

Ziet er goed uit, bedankt!

@ Iedereen: bedankt voor de input!!!!!

@ CodeCaster: Het is een configuratiescherm waarin je o.a. een nieuwe Tapi Service Provider kan selecteren. Als je dit doe dan wil je dat het gelijk werkt, dus moet ik opnieuw de events koppelen aan de juiste TSP. Dit kan door de applicatie opnieuw op te starten of door de functie gewoon opnieuw aan te roepen.

Nogmaals bedankt voor jullie input!

Acties:
  • 0 Henk 'm!

  • Nappa
  • Registratie: Februari 2001
  • Laatst online: 27-06 00:10

Nappa

The Barbaric Saiya-jin!

Let wel op dat de Closed en Closing events van Form obsolete zijn sinds framework 2.0. Je kunt in plaats daarvan vFormClosed en FormClosing gebruiken.

Alles wat ik zeg kan en zal tegen u gebruikt worden
Scream! Suffer! Panic! | Dark-future Dawnbringer | Unofficial Mordor community


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Ah jah dat is waar :) Teveel met WPF gewerkt :$

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 25-05 11:39
Ik snap het gebruik van de Closed event eigenlijk niet... Als je je form met ShowDialog aanroept, dan returned hij pas nadat die dialog form gesloten is (dus als de DialogResult property gezet is).

Daar kun je toch gebruik van maken:

C#:
1
2
3
4
5
6
7
8
9
using (var f = new formB())
{
    if (f.ShowDialog() == DialogResult.OK)
    {
        // form f is nu gesloten dmv een OK knop (en niet kruisje of Cancel oid)
        // doe actie hier
        MessageBox.Show(f.Text);
    }
}

In formB moet je dan de DialogResult op OK zetten als dat zo is (dus bijvoorbeeld in de Click event van een OK knop) en op iets anders (bijv Cancel) als de gebriuker op de Cancel knop klikt.

Je code zal in dit geval de Text van formB tonen, maar alleen als de gebruiker OK gekozen heeft. In plaats van de tekst (dat is nutteloos natuurlijk) gebruik je dan (mogelijk) een andere property, maar dat ligt er helemaal aan wat formB precies doet.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Wie zegt dat hij het aanroept met ShowDialog? :)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Sikkek
  • Registratie: Maart 2004
  • Laatst online: 11-07 08:16
NickThissen schreef op vrijdag 28 mei 2010 @ 14:35:
Ik snap het gebruik van de Closed event eigenlijk niet... Als je je form met ShowDialog aanroept, dan returned hij pas nadat die dialog form gesloten is (dus als de DialogResult property gezet is).
Als je je Form met Show() i.p.v. ShowDialog() opent, gaat de code wel meteen door en heeft het event wel degelijk nut!

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 25-05 11:39
Uiteraard, maar de uitleg van te TS + het feit dat hij het over een configuratiescherm heeft lijkt me een goede reden om een Dialog te gebruiken. Als hij perse geen dialog wil dan zal hij iets anders moeten zoeken ja, maar in mijn ogen en met de informatie die gegeven is, is een dialog hier toch op zijn plaats.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

Anoniem: 267161

Topicstarter
Heren, Tweakers, (dus niet alleen heren ;))

De gegeven oplossing werkt prima naar wens! Ik heb nog even goed nagedacht over de functie die ik wilde aanroepen en bleek dat het grotendeels overbodig was, het gaat enkel om een foreach loop. Deze heb ik geplaatst in de code zoals geadviseerd door Snake en dit werkt. ben er super tevreden mee!

Voor wie het graag wil zien:
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
        private void configBtn_Click(object sender, EventArgs e)
        {
            var configForm = new configurationForm();
            configForm.Closed += (s, eventArgs) => {

                foreach (TapiLine line in mgr.Lines)
                {
                    if (line.Capabilities.ProviderInfo == callerMAXSetting.GetInstance().tapiTspName) //"Activa Asterisk TSP"
                    {
                        currentLine = line;
                        // outputBox.Text = "TapiLine geselecteerd: " + currentLine.Capabilities.ProviderInfo + "\r\n";
                        if (!currentLine.IsOpen)
                        {
                            try
                            {
                                currentLine.Open(line.Capabilities.MediaModes);
                            }
                            catch (TapiException)
                            {
                                currentLine.Open(MediaModes.DataModem);
                            }
                            // Wire up event handlers
                            currentLine.NewCall += this.incomingCall;
                            currentLine.CallStateChanged += this.OnCallStateChange;
                        }
                        break;
                    }
                }
            };
            configForm.ShowDialog();
        }

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Anoniem: 267161 schreef op vrijdag 28 mei 2010 @ 15:27:
Voor wie het graag wil zien:
C#:
1
*snip*
Hmm, nu gebruik je ShowDialog() in combinatie met deprecated Closed. FormClosed hoeft juist niet in combinatie met ShowDialog().. :p Verder zou ik dat opzoeken met Linq doen, dat is korter en dan kun je ook het geval 'niet gevonden' goed afhandelen. En die try{ } catch{} lijkt me vreemd, kun je niet erachter komen wat je mee moet geven aan Open? :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Anoniem: 267161

Topicstarter
pedorus schreef op zaterdag 29 mei 2010 @ 02:15:
[...]

Hmm, nu gebruik je ShowDialog() in combinatie met deprecated Closed. FormClosed hoeft juist niet in combinatie met ShowDialog().. :p Verder zou ik dat opzoeken met Linq doen, dat is korter en dan kun je ook het geval 'niet gevonden' goed afhandelen. En die try{ } catch{} lijkt me vreemd, kun je niet erachter komen wat je mee moet geven aan Open? :)
Linq. Ben ik totaal mee onbekend..Oftewel, nog meer redenen om dan juist op te zoeken hoe dat moet! Bedankt voor de tip.

En ja wat ik meot doen is een verbinding openen richting de TSP (Tapi Service Provider) en dat moet het liefst in de modus zoals in de try. Mocht deze niet gaan dan stuitert hij over naar de algemeen en 'altijd' beschikbare modus die wel kan communiceren met de telefoon. Dit stukje code heb ik van de maker van de wrapper gekregen (JulMar om precies te zijn:)).




[EDIT]

Ik ervaar wel een klein probleempje met deze methode. Na het sluiten van het configform lijkt het alsof hij de window niet volledig afsluit. Dus ik heb in de code meegenomen configForm.Close(); en configForm.Dispose(); maar na het afsluiten van het programma blijft er nog een instance runnen...Any thoughts?

[ Voor 14% gewijzigd door Anoniem: 267161 op 31-05-2010 12:16 ]


Acties:
  • 0 Henk 'm!

Anoniem: 267161

Topicstarter
Wederom terug met nog steeds dezelfde vraag. Ik post het opnieuw omdat ik denk dat mijn edit onopgemerkt is gebleven.

Ik heb wat zitten klooien om het zelf op te lossen en op internet gezocht. Ik heb met de gevonden informatie getracht het process keihard af te sluiten. Dit was ook onsuccesvol. Ik heb gevonden dat wanneer ik het configuratiescherm (FormB) niet aanroep dat bij het afsluiten van het programma er niks fout gaat. Indien ik het configuratiescherm (nog steeds FormB) wel aanroep, dan blijft het proces draaien na het afsluiten van het programma.

ik heb de volgende snippet gebruikt voor het afsluiten van het proces:
[code="c#"]
foreach ( Process p in System.Diagnostics.Process.GetProcessesByName("procesNaam") )
{
try
{
p.Kill();
p.WaitForExit(); // possibly with a timeout
}
catch ( Win32Exception winException )
{
// process was terminating or can't be terminated - deal with it
}
catch ( InvalidOperationException invalidException )
{
// process has already exited - might be able to let this one go
}
}

[/code]

Iemand nog enige idee ??


In Visual Studio werkt de code helemaal niet, erbuiten wel. Had tevens de instancenaam exact overgetikt, deze bevat hoofdletters, en alles dient kennelijk in kleine letters te zijn. De code werkt wel en mijn applicatie sluit af.

Beschouw mijn vorige comments als niet geschreven.
Allen nogmaals bedankt voor jullie adviezen!

[ Voor 12% gewijzigd door Anoniem: 267161 op 01-06-2010 10:30 ]


Acties:
  • 0 Henk 'm!

  • IceM
  • Registratie: Juni 2003
  • Laatst online: 11-07 11:01
In je eerste post gebruik je een event om te controleren of het form sluit. Dit hoeft met ShowDialog() niet. ShowDialog is "blocking"... e.g. je code na ShowDialog() wordt pas uitgevoerd als het scherm gesloten is. Dit gaat dus ook werken en is naar mijn mening netter:
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
        private void configBtn_Click(object sender, EventArgs e) 
        { 
            var configForm = new configurationForm(); 
            configForm.ShowDialog(); 
            
            foreach (TapiLine line in mgr.Lines) 
            { 
                if (line.Capabilities.ProviderInfo == callerMAXSetting.GetInstance().tapiTspName) //"Activa Asterisk TSP" 
                { 
                    currentLine = line; 
                    // outputBox.Text = "TapiLine geselecteerd: " + currentLine.Capabilities.ProviderInfo + "\r\n"; 
                    if (!currentLine.IsOpen) 
                    { 
                        try 
                        { 
                            currentLine.Open(line.Capabilities.MediaModes); 
                        } 
                        catch (TapiException) 
                        { 
                            currentLine.Open(MediaModes.DataModem); 
                        } 
                        // Wire up event handlers 
                        currentLine.NewCall += this.incomingCall; 
                        currentLine.CallStateChanged += this.OnCallStateChange; 
                    } 
                    break; 
                } 
            }
            
        }


Wat betreft je tweede vraag: wat doet het configuratie form? Het lijkt erop dat je ergens gebruik maakt van een Thread die niet goed afsluit. Het process killen zoals je nu doet is erg vies en een workaround, je kunt beter het probleem (dat dus in het configuratie form zit) oplossen.

...

Pagina: 1