Forum: PC-Programmierung C# CheckListBox zuweisen


von Peter (Gast)


Lesenswert?

Hallo,

zur Visualisierung von einem Modbus RTU will ich eine UInt16 einer 
CheckListBox zuweisen. Habe folgendes probiert aber es funktioniert 
nicht. Hat was mache ich falsch?
So will ich die Funktion aufrufen und zuweisen.
1
cbl_control = UInt16_To_CheckListBox( Modbus_Data );
2
3
4
        private CheckedListBox UInt16_To_CheckListBox(UInt16 Input)
5
        {
6
            string[] Bit_List = new string[16];
7
            CheckedListBox Output = new CheckedListBox();
8
            Bit_List[0] = "Bit 0";
9
            Bit_List[1] = "Bit 1";
10
            Bit_List[2] = "Bit 2";
11
            Bit_List[3] = "Bit 3";
12
            Bit_List[4] = "Bit 4";
13
            Bit_List[5] = "Bit 5";
14
            Bit_List[6] = "Bit 6";
15
            Bit_List[7] = "Bit 7";
16
            Bit_List[8] = "Bit 8";
17
            Bit_List[9] = "Bit 9";
18
            Bit_List[10] = "Bit 10";
19
            Bit_List[11] = "Bit 11";
20
            Bit_List[12] = "Bit 12";
21
            Bit_List[13] = "Bit 13";
22
            Bit_List[14] = "Bit 14";
23
            Bit_List[15] = "Bit 15";
24
25
            Output.Items.AddRange(Bit_List);
26
27
            Output.SetItemChecked(0, Convert.ToBoolean(Input & (1 << 0)));
28
            Output.SetItemChecked(1, Convert.ToBoolean(Input & (1 << 1)));
29
            Output.SetItemChecked(2, Convert.ToBoolean(Input & (1 << 2)));
30
            Output.SetItemChecked(3, Convert.ToBoolean(Input & (1 << 3)));
31
            Output.SetItemChecked(4, Convert.ToBoolean(Input & (1 << 4)));
32
            Output.SetItemChecked(5, Convert.ToBoolean(Input & (1 << 5)));
33
            Output.SetItemChecked(6, Convert.ToBoolean(Input & (1 << 6)));
34
            Output.SetItemChecked(7, Convert.ToBoolean(Input & (1 << 7)));
35
            Output.SetItemChecked(8, Convert.ToBoolean(Input & (1 << 8)));
36
            Output.SetItemChecked(9, Convert.ToBoolean(Input & (1 << 9)));
37
            Output.SetItemChecked(10, Convert.ToBoolean(Input & (1 << 10)));
38
            Output.SetItemChecked(11, Convert.ToBoolean(Input & (1 << 11)));
39
            Output.SetItemChecked(12, Convert.ToBoolean(Input & (1 << 12)));
40
            Output.SetItemChecked(13, Convert.ToBoolean(Input & (1 << 13)));
41
            Output.SetItemChecked(14, Convert.ToBoolean(Input & (1 << 14)));
42
            Output.SetItemChecked(15, Convert.ToBoolean(Input & (1 << 15)));
43
            return Output;
44
        }

von GoMaD A. (gomad_a)


Lesenswert?

Mach aus:

Peter schrieb:
> CheckedListBox Output = new CheckedListBox();

CheckedListBox Output = cbl_control;

Ist es das Ergebnis welches du willst?

: Bearbeitet durch User
von Peter (Gast)


Lesenswert?

Ziel ist es jedes der 16 Bits des UInt16 als Kästchen anzuzeigen. Diese 
Funktion aber auch an anderen Stellen verwenden zu können.

von Markus (Gast)


Lesenswert?

Ich würde vielleicht eher mal folgendes versuchen:
1
    //löschen: cbl_control = UInt16_To_CheckListBox( Modbus_Data );
2
    UInt16_To_CheckListBox( cbl_control, Modbus_Data );
3
4
    private void UInt16_To_CheckListBox(CheckedListBox Output, UInt16 Input)
5
    {
6
        ....
7
    }
Grüße
Markus

von Flugmops (Gast)


Lesenswert?

Peter schrieb:
> aber es funktioniert nicht.

Hmm... das ist ja eine recht umfassende Problembeschrebung.

Du erzeugst bei jedem Aufruf eine neue CheckedListBox und weist sie 
einer Variablen zu. Falls da nicht der entscheidende Code fehlt: Warum 
sollte das die UI interessieren? Erzeuge doch einfach eine 
CheckedListBox im UI-Editor und verwende dann diese in 
UInt16_To_CheckListBox (der Name wäre dann aber nicht ganz richtig).

Peter schrieb:
> Diese Funktion aber auch an anderen Stellen verwenden zu können.

Um die selbe CheckedListBox zu verwenden oder wirklich immer wieder ein 
neues Control zu erzeugen? Würmer, Nase ...

von Markus (Gast)


Lesenswert?

Ach ja, anstelle von
1
Convert.ToBoolean(Input & (1 << 0))

könntest Du auch kompakter
1
(Input & (1 << 0)) != 0

schreiben.

Außerdem kannst Du die 16 Zeilen bequem in eine For-Schleife umwandweln. 
Die Methode wird kompakter und leichter änderbar.

Und wenn Du dann noch eine Methode mit den Parametern Input und 
BitNumber und einem bool Return-Wert aus dem obigen Ausdruck machst...

Grüße
Markus

von Peter (Gast)


Lesenswert?

Hallo,

danke schon mal. Bin neu in der C# Welt und wusste nicht das man die 
Variablen einfach als Ein und Ausgangsvariablen benutzen kann. So 
funktioniert  es jetzt.
1
        private void UInt16_To_CheckListBox(UInt16 Input, CheckedListBox Output)
2
        {
3
            Output.SetItemChecked(0, Convert.ToBoolean(Input & (1 << 0)));
4
            Output.SetItemChecked(1, Convert.ToBoolean(Input & (1 << 1)));
5
            Output.SetItemChecked(2, Convert.ToBoolean(Input & (1 << 2)));
6
            Output.SetItemChecked(3, Convert.ToBoolean(Input & (1 << 3)));
7
            Output.SetItemChecked(4, Convert.ToBoolean(Input & (1 << 4)));
8
            Output.SetItemChecked(5, Convert.ToBoolean(Input & (1 << 5)));
9
            Output.SetItemChecked(6, Convert.ToBoolean(Input & (1 << 6)));
10
            Output.SetItemChecked(7, Convert.ToBoolean(Input & (1 << 7)));
11
            Output.SetItemChecked(8, Convert.ToBoolean(Input & (1 << 8)));
12
            Output.SetItemChecked(9, Convert.ToBoolean(Input & (1 << 9)));
13
            Output.SetItemChecked(10, Convert.ToBoolean(Input & (1 << 10)));
14
            Output.SetItemChecked(11, Convert.ToBoolean(Input & (1 << 11)));
15
            Output.SetItemChecked(12, Convert.ToBoolean(Input & (1 << 12)));
16
            Output.SetItemChecked(13, Convert.ToBoolean(Input & (1 << 13)));
17
            Output.SetItemChecked(14, Convert.ToBoolean(Input & (1 << 14)));
18
            Output.SetItemChecked(15, Convert.ToBoolean(Input & (1 << 15)));
19
        }

von Flugmops (Gast)


Lesenswert?

Wenn du Code oft wiederholst, sollte etwas klingeln ...
1
private void SetCheckListBox(ushort input, CheckedListBox target)
2
{
3
  for(ushort i = 0; i < 16; i++)
4
  {
5
    target.SetItemChecked(i, (input & (1 << i)) != 0);
6
  }
7
}

Nicht so wichtig, aber als Hinweis: Parameternamen werden in C# 
praktisch immer klein geschrieben und Methodennamen in "Camel Case" 
(keine Unterstriche).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.