C# Vraagje

Vragen die je boven niet kwijt kunt, kan je hier stellen.

Moderator: Moderators

Plaats reactie
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13490
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Ik loop weer even tegen een uitdaging aan..

zoals gezegd ik ben de boel nu aan het opsplitsen in Classes, want dat houdt het overzichtelijk.
Edsger W. Dykstra schreef:“Simplicity is prerequisite for reliability.”
Stel.. ik wil een dialoogje openen.. dan "kop ik een waarde over de schutting" waaraan ik in de Class Dialogs kan zien welke dialoog ik wil invullen..
't aantal rijen terugkoppen.. da's geen probleem.. dat heb ik inmiddels..
Maar dan de velden.. Ik kan per dialoog de velden in één String[] gooien, maar hoe return ik die?..
hfjbuis
Donateur
Berichten: 3077
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Maar dan de velden.. Ik kan per dialoog de velden in één String[] gooien, maar hoe return ik die?..
Je moet een custom dialog maken met daarin alle velden (variabelen in een class) die je nodig hebt. Deze velden vulje voordat je de dialoog opent, dan hoef je ook niets in een string te proppen. Op zo'n zelfde manier kun je een resultaat terug geven, ook in een (of meer) variabele van deze custom class stoppen. De dialog geeft als resultaat OK, Cancel, etc https://docs.microsoft.com/en-us/dotnet ... esktop-6.0
Aan de hand van de dialog result bepaal je dan de gewenste actie en daarbij gebruik je de in de class gedefinieerde variabelen die door de dialog zijn gevuld.
There are only 2 limits, the sky and your imagination
rverhag
Berichten: 75
Lid geworden op: 26 jul 2012 14:47
Locatie: Oost Souburg, Zeeland

Re: C# Vraagje

Bericht door rverhag »

Arie Kabaalstra schreef: 16 mar 2022 17:59 Stel.. ik wil een dialoogje openen.. dan "kop ik een waarde over de schutting" waaraan ik in de Class Dialogs kan zien welke dialoog ik wil invullen..
't aantal rijen terugkoppen.. da's geen probleem.. dat heb ik inmiddels..
Maar dan de velden.. Ik kan per dialoog de velden in één String[] gooien, maar hoe return ik die?..
Wat bedoel je precies met "de velden"? Zijn dit bijv. Textboxen op een DialogForm?

In dat geval kan je de Modifiers van deze Textboxen op public zetten (staan default op private). Hiermee wordt de toegankelijkheid van de betreffende Textboxen breder en kan je ze aan de buitenkant van het Form benaderen.

Voorbeeld: maak een Form met de naam Dialoog1. Plaats er een Textbox op met de Name "Naam". Zet de Modifiers van de Textbox op public.
Zet er ook een button op en zet hiervan Dialogresult op OK (zoals hfjbuis al aangaf)

Nu kan je het dialoog openen en de waarde van Textbox Naam uitlezen via:

Code: Selecteer alles

Dialoog1 dialoog = new Dialoog1();
DialogResult result= dialoog.ShowDialog();
 if (result == DialogResult.OK)
        {
             string naam = dialoog.Naam.Text;
        }
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13490
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Ik wil een DataGridview gebruiken als Dialoog, een beetje zoals een Propertygrid dus.

'k dacht weer veel te moelijk.. ik moet niet een array terugkoppen vanuit de Class.. maar gewoon een string, Character Separated, en dan de substrings met string.Split eruit peuteren.. da's veel makkelijker..
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13490
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

'k wil nu vanaf Form 1, een variabele doorgeven aan de Class met de dialogen, de waarde moet corresponderen met de te tonen dialoog (dus de terug te koppen string met de waarden van de velden)

Is dat mogelijk?.. iets met een Switch/Case, zodat als ik de variabele de waarde 1 geef, dat de string voor dialoog 1 returned, en met waarde 2 de string voor dialoog 2, enzovoort..
rverhag
Berichten: 75
Lid geworden op: 26 jul 2012 14:47
Locatie: Oost Souburg, Zeeland

Re: C# Vraagje

Bericht door rverhag »

Een optie zou kunnen zijn (er zijn vele wegen naar het oude Rome...)

Stel je hebt 2 dialogen (Dialoog1 en Dialoog2) allebei van de class Form (verder hier niet getoond). Dan zou je een centrale dialogclass kunnen maken:

Code: Selecteer alles

 public class DialogClass : List<Form>
    {
        public DialogClass()
        {
            Add(new Dialoog1());
            Add(new Dialoog2());
        }

        public string Open(int dialoog)
        {
            DialogResult result = this[dialoog].ShowDialog();
            if (result == DialogResult.OK)
            {
                return "Het antwoord van de gevraagde dialoog";
            }

            return "niets";
        }
    }


Form1 zou er dan zo uit kunnen zien (slechts 1 button geplaatst)

Code: Selecteer alles

 public partial class Form1 : Form
    {
        private DialogClass dialogs;
        public Form1()
        {
            InitializeComponent();
            dialogs = new DialogClass();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var antwoordvandialog1 = dialogs.Open(0);
            var antwoordvandialog2 = dialogs.Open(1);   
        }
    }
En nu even in gewoon Nederlands: De class DialogClass erft van List<Form>. M.a.w. Hij is een lijst met objecten van het type Form. In de constructor worden beide dialogen geinstantieerd en in de lijst geplaatst. (let op. deze lijst is zero-based)

de class heeft ook een method Open(...) waarmee de dialoog met het gevraagde nr wordt getoond. De method geeft eventueel gelijk de string terug van de dialoog. Het is maar hoe je dit wil afhandelen. Let er wel op dat er hier geen controles plaatsvinden dus het spulletje over de zeik krijgen is zo gedaan (bijv Open(2)).

in de button1_click van het form worden de dialogen direct achter elkaar geopend. Dit natuurlijk alleen ter lering en vermaak. Het geeft wellicht een idee van de mogelijkheden.

Maar nogmaals: Zo zou het kunnen. Het kan natuurlijk op veel meer manieren.
hfjbuis
Donateur
Berichten: 3077
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Een message dialog kan maar heel beperkt wat terug geven. Wil je meer, dan moet je dat er zelf bij programmeren.

Hier een voorbeeld van een handmatige toolchange die uitgevoerd, uitgesteld of afgebroken kan worden.
De procedure ShowMessageDialog gebruik ik op meerdere plaatsen in mijn programma en zit in een biblotheek.
De procedure RequestToolChange gebruik ShowMessageDialog om aan de gebruiker te vragen een handmatige toolchange uit te voeren. De gebruiker heeft de optie om af te breken (Abort) uit te voeren (Continue) of uit te stellen (Command3)

Code: Selecteer alles

public static async Task<String> ShowMessageDialog(String Message, String Title, String Command1, String Command2, String Command3)
{
    MessageDialog MessageDialog;
    if (Title != "") MessageDialog = new MessageDialog(Message, Title);
    else MessageDialog = new MessageDialog(Message);
    MessageDialog.Commands.Add(new UICommand(Command1) { Id = 0 });
    if (Command2 != "") MessageDialog.Commands.Add(new UICommand(Command2) { Id = 1 });
    if (Command3 != "") MessageDialog.Commands.Add(new UICommand(Command3) { Id = 2 });
    IUICommand Result = await MessageDialog.ShowAsync();
    return Result.Label;
}
 public async Task<Boolean> RequestToolChange( )
     String Result = await Statics.ShowMessageDialog(ToolInfo, ChangeInfo, "Abort", "Continue", "Postpone");
     if (Result == "Abort") return false;
     if (Result == "Continue")               // register that the toolchange is done
        {
            ToolChangePostponed = false;
        }
        if (Result == "Postpone")                // register that the toolchange is posponed
        {
            ToolChangePostponed = true;
        }
        return true;
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13490
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Ik maak de dialogen middels een DataGridview:

Code: Selecteer alles

 private void button2_Click(object sender, EventArgs e)
        {
            dataGridView1.RowCount = Dialog.DialogReset();
            dataGridView1.Show();
            String[] DialogFields = Dialog.Fields().Split(",");
            int i = 0;
            foreach (String Fields in DialogFields)
            {
                dataGridView1.Rows.Add();
                dataGridView1[0, i].Value = DialogFields[i];
                i++;
            }
        }
Dit is nog even de "testversie", maar 't zal niet wezenlijk veranderen.

Dit staat er in de Class Dialog

Code: Selecteer alles

 public static string Fields()
        {
            string Fields = "G84 FACING,X1,Z1,X2,Z2,DEPTH OF CUT,FEEDRATE,OK";
            return Fields;
        }
als ik nou in de "knoppen" in Form 1 een variabele kan invullen, kan ik die er dan in de Class Dialog uitpeuteren om met een switch/case de juiste string terug te koppen?
lordprimoz
Berichten: 141
Lid geworden op: 27 jun 2017 13:40
Locatie: Hengelo

Re: C# Vraagje

Bericht door lordprimoz »

Heb je ooit iets als git gebruikt? (Bijv via GitHub of gitlab?)
Daarmee kan je makkelijk al jouw code bewaren, en als je alles publiek beschikbaar maakt ook nog eens makkelijk inzichtelijk voor iedereen hier.
hfjbuis
Donateur
Berichten: 3077
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Arie Kabaalstra schreef: 18 mar 2022 15:41 'k wil nu vanaf Form 1, een variabele doorgeven aan de Class met de dialogen, de waarde moet corresponderen met de te tonen dialoog (dus de terug te koppen string met de waarden van de velden)
Is dat mogelijk?.. iets met een Switch/Case, zodat als ik de variabele de waarde 1 geef, dat de string voor dialoog 1 returned, en met waarde 2 de string voor dialoog 2, enzovoort..
Ik dacht de heletijd dat je de C# Dialog class bedoelde.....

Als je een class hebt met dialogen (Dat is dus niet de dialog class) dan moet je van de class een variable definiëren om het te kunnen gebruiken
DialogenClass Dialoog1= new DialogenClass ()

Je kunt in deze DialogenClass (nog) een constructor maken waaraan je een variable mee geeft
DialogenClass (String String1)

Deze string bewaar je in de DialogenClass. Hier voor moet je in de DialogenClass een variabele definiëren. Vervolgens kun je deze variable gebruiken in deze class of alles dat toegang heeft tot een varialbele van deze class

Code: Selecteer alles

public class DialogenClass
{
  public String String1="";
  DialogenClass()  // Dit is een constructor
  {
  }
  DialogenClass(String Str1) // Dit is een2e  constructor
  {
   String1=str1;
  }
}
DialogenClass Dialoog1 = new DialogenClass();
DialogenClass Dialoog2 = new DialogenClass("Test1");

There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13490
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

lordprimoz schreef: 18 mar 2022 18:59 Heb je ooit iets als git gebruikt? (Bijv via GitHub of gitlab?)
Daarmee kan je makkelijk al jouw code bewaren, en als je alles publiek beschikbaar maakt ook nog eens makkelijk inzichtelijk voor iedereen hier.
Nee, omdat ik niet weet wat het is, of hoe je het gebruikt.
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13490
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

Het blijft leuk.. ik gebruik dus een DataGridview als dialoog, maar als ik op de onderste regel ben.. en ik hei op Enter.. dan moet ie dus de data uit de Gridview pulken, en dan de Gridview weer verbergen..

Maar.. een DataGridview_Keydown event werkt niet als je in een Cel staat die in Editmode staat.. Dus.. wat doe je dan?..

Code: Selecteer alles

		int LastRow = Dialog1.Rows.Count - 1;
                Dialog1.Rows[LastRow].Cells[1].ReadOnly=true;
(Damn!.. is het zo simpel?).. Ja.. je maakt die ene cel ReadOnly.. zodat de Gridview zelf weer de focus krijgt, en niet die cel..
hfjbuis
Donateur
Berichten: 3077
Lid geworden op: 13 feb 2017 00:26
Locatie: Hoensbroek

Re: C# Vraagje

Bericht door hfjbuis »

Arie Kabaalstra schreef: 07 apr 2022 00:04 (Damn!.. is het zo simpel?).. Ja.. je maakt die ene cel ReadOnly.. zodat de Gridview zelf weer de focus krijgt, en niet die cel..
Omdat de cel readonly is, kan de cel (dat text veld in het grid view item) de key event niet afhandelen. De key event komt dan terecht bij de event handler van de parent van dat text veld in die cell. Dat gaat zo door totdat er in de hiërarchie een eventhandler is die de event wel handelt.
Dat kan een door jou gemaakte event handler zijn.
There are only 2 limits, the sky and your imagination
Gebruikersavatar
Arie Kabaalstra
Donateur
Berichten: 13490
Lid geworden op: 07 feb 2007 18:37
Locatie: Bakhuuz'n
Contacteer:

Re: C# Vraagje

Bericht door Arie Kabaalstra »

hfjbuis schreef: 07 apr 2022 00:22
Arie Kabaalstra schreef: 07 apr 2022 00:04 (Damn!.. is het zo simpel?).. Ja.. je maakt die ene cel ReadOnly.. zodat de Gridview zelf weer de focus krijgt, en niet die cel..
Omdat de cel readonly is, kan de cel (dat text veld in het grid view item) de key event niet afhandelen. De key event komt dan terecht bij de event handler van de parent van dat text veld in die cell. Dat gaat zo door totdat er in de hiërarchie een eventhandler is die de event wel handelt.
Dat kan een door jou gemaakte event handler zijn.
Ja.. Ik kwam ook wat codevoorbeeldjes tegen die het op die manier oplosten.. maar ik vond dat nogal omslachtig..
Daarom heb ik het zo opgelost.. het moet alleen werken op de laatste cel van de laatste regel.. meer dan dat is het niet, was het niet, zal het nooit worden..

Nu de volgende stap.. hij verbergt de Gridview keurig, nu even de code ertussen frotten om de ingevulde waarden mooi in een array te mikken ofzo.. zodat ik de gegevens dan mooi uit de array kan peuteren als ik de G-code regel opstel..

ook nog wat lolligs wat ik had verzonnen.. als je nu in het programma "FACING" typt, dan toont ie de dialoog voor Facing ofwel vlakdraaien.. hetzelfde dus nu ook voor Turning (omdat die beiden G84 zijn, maar bij Facing programmeer je eerst Z dan X, en Bij Turning is het net andersom)
Voor Threading an Drilling moet ik het nog maken.. maar da's een kwestie van kopiëren en veranderen wat anders moet zijn..
Plaats reactie