Avatar billede koppelgaard Praktikant
16. november 2009 - 22:38 Der er 8 kommentarer og
1 løsning

InvokeRequired ckeckbox

Har en baggrundstråd, der skal ændre state af en checkbox.
Klassen, hvor dette skulle foregå ses nedenfor.
Jeg har forsøgt at implementerer en delegate,  men kan ikke få det til at virke. Hvad er galt ?

using System;
using System.Windows.Forms;

namespace Hysteresis
{
    public class ValveAlarmView
    {
        CheckBox checkBoxVac;
        CheckBox checkBoxAtm;
        private delegate void CheckboxDelegate(bool alarm);
       

        public ValveAlarmView(CheckBox checkBoxVac, CheckBox checkBoxAtm)
        {
            this.checkBoxVac = checkBoxVac;
            this.checkBoxAtm = checkBoxAtm;
        }

        public void SetAlarmVac(bool alarm)
        {

            if (checkBoxVac.InvokeRequired)
                checkBoxVac.Invoke(new CheckboxDelegate(SetAlarmVac), new[] {alarm });
            checkBoxVac.Checked = alarm; 
        }
        public void SetAlarmAtm(bool alarm)
        {
            if (checkBoxAtm.InvokeRequired)
                checkBoxAtm.Invoke(new CheckboxDelegate(SetAlarmAtm), new[] { alarm });
            checkBoxAtm.Checked = alarm;
        }
    }
}
Avatar billede Syska Mester
16. november 2009 - 23:21 #1
Første problem der lige springer mig i øjene er din "SetAlarmVac"
if (checkBoxVac.InvokeRequired)
                checkBoxVac.Invoke(new CheckboxDelegate(SetAlarmVac), new[] {alarm });
else
            checkBoxVac.Checked = alarm; 

Du mangler en else i den ... eller bliver checkBoxVac jo sat lige meget om det er form thread owner eller ej ...

// ouT
Avatar billede koppelgaard Praktikant
17. november 2009 - 09:18 #2
sådan ?
using System;
using System.Windows.Forms;

namespace Hysteresis
{
    public class ValveAlarmView
    {
        CheckBox checkBoxVac;
        CheckBox checkBoxAtm;
        private delegate void CheckboxDelegate(bool alarm);
       

        public ValveAlarmView(CheckBox checkBoxVac, CheckBox checkBoxAtm)
        {
            this.checkBoxVac = checkBoxVac;
            this.checkBoxAtm = checkBoxAtm;
        }

        public void SetAlarmVac(bool alarm)
        {

            if (checkBoxVac.InvokeRequired)
                checkBoxVac.Invoke(new CheckboxDelegate(SetAlarmVac), new[] {alarm });
            else
                checkBoxVac.Checked = alarm; 
        }
        public void SetAlarmAtm(bool alarm)
        {
            if (checkBoxAtm.InvokeRequired)
                checkBoxAtm.Invoke(new CheckboxDelegate(SetAlarmAtm), new[] { alarm });
            else
                checkBoxAtm.Checked = alarm;
        }
    }
}

det giver desværre fejlmeddelsen:


System.ArgumentException: Object of type 'System.Boolean[]' cannot be converted to type 'System.Boolean'.
  at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
  at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
  at Hysteresis.ValveAlarmView.SetAlarmVac(Boolean alarm) in C:\Documents and Settings\mko\My Documents\Visual Studio 2008\Projects\Hysteresis\Hysteresis\ValveAlarmView.cs:line 23
  at Hysteresis.SerielValve.CloseValveVac() in C:\Documents and Settings\mko\My Documents\Visual Studio 2008\Projects\Hysteresis\Hysteresis\SerielValve.cs:line 75
Avatar billede Syska Mester
17. november 2009 - 09:29 #3
Fordi du angiver et array ... og din delegate siger du sender en enkel bool med ...

Prøv:
checkBoxAtm.Invoke(new CheckboxDelegate(SetAlarmAtm), alarm );
Avatar billede koppelgaard Praktikant
17. november 2009 - 09:32 #4
Ja selvfølgelig !
Avatar billede koppelgaard Praktikant
17. november 2009 - 11:10 #5
Sådan?
using System;
using System.Windows.Forms;

namespace Hysteresis
{
    public class ValveAlarmView
    {
        CheckBox checkBoxVac;
        CheckBox checkBoxAtm;
        private delegate void CheckboxDelegate(bool alarm);
       

        public ValveAlarmView(CheckBox checkBoxVac, CheckBox checkBoxAtm)
        {
            this.checkBoxVac = checkBoxVac;
            this.checkBoxAtm = checkBoxAtm;
        }

        public void SetAlarmVac(bool alarm)
        {

            if (checkBoxVac.InvokeRequired)
                checkBoxVac.Invoke(new CheckboxDelegate(SetAlarmVac), new {alarm });
            else
                checkBoxVac.Checked = alarm; 
        }
        public void SetAlarmAtm(bool alarm)
        {
            if (checkBoxAtm.InvokeRequired)
                checkBoxAtm.Invoke(new CheckboxDelegate(SetAlarmAtm), new { alarm });
            else
                checkBoxAtm.Checked = alarm;
        }
    }
}

Det giver fejlen:


11:09:09:
System.ArgumentException: Object of type '<>f__AnonymousType0`1[System.Boolean]' cannot be converted to type 'System.Boolean'.
  at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
  at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
  at Hysteresis.ValveAlarmView.SetAlarmVac(Boolean alarm) in C:\Documents and Settings\mko\My Documents\Visual Studio 2008\Projects\Hysteresis\Hysteresis\ValveAlarmView.cs:line 23
  at Hysteresis.SerielValve.CloseValveVac() in C:\Documents and Settings\mko\My Documents\Visual Studio 2008\Projects\Hysteresis\Hysteresis\SerielValve.cs:line 75
Avatar billede Syska Mester
17. november 2009 - 12:00 #6
Du skriver jo ikke hvad jeg skrev ...

new {} laver en anonym type ... du skal bare smide "alarm" ind.
Avatar billede koppelgaard Praktikant
17. november 2009 - 13:31 #7
Jeg er nok lidt laaangsom, men nu virker det:-)
Sender du et svar ?

Michael
Avatar billede Syska Mester
17. november 2009 - 13:44 #8
Her kommer et svar.

// ouT
Avatar billede Syska Mester
17. november 2009 - 13:44 #9
dohhhhh, her kommer det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester