C# CheckListBox zuweisen

Gast #4624327
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
        }
Gast #4624367
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
Gast #4624370
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 ...
Gast #4624381
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
Gast #4624397
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
        }
Gast #4624426
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren