Как я могу назначить объект интерфейса для динамического объекта в методе? - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь создать функцию для назначения интерфейсных объектов динамическим объектам, которые я легко создал в своей структуре.Вот моя структура:

public struct PSU
{
    public CheckBox CallHostessButton0, CallHostessButton1,
        ReadLightButton0, ReadLightButton1, ReadLightButton2, ReadLightButton3;
    public PictureBox BeltLight, SmokeLight;
}

А вот моя функция:

public void AssignObjectsToPSU(UniversalVariables.PSU psu, CheckBox 
CallHostessBtn0, EventHandler HBtn0CheckedChanged, CheckBox 
CallHostessBtn1, EventHandler HBtn1CheckedChanged)
{
// and i'm trying to do this in my function:
...
psu.CallHostessButton0 = CallHostessBtn0;
psu.CallHostessButton0.CheckedChanged += new EventHandler(HBtn0CheckedChanged); 
...
}

Программа работает без сбоев, но когда я пытаюсь сделать это в событии CheckedChanged:

if (TestPSU.CallHostessButton0.Checked)
{
    TestPSU.CallHostessButton0.BackgroundImage = Properties.Resources.lamp_on;
}
else
{
    TestPSU.CallHostessButton0.BackgroundImage = Properties.Resources.lamp_off;
}

Программа выдает ошибку, которая:

Exception thrown: 'System.NullReferenceException' in IOS_Interface.exe
TestPSU.**CallHostessButton0** was null.

Как это может быть нулем?Я назначаю это по моему AssignObjectsToPSU методу?

1 Ответ

0 голосов
/ 26 декабря 2018

Я нашел решение, просто изменил тип структуры на класс, и это сработало.

Я изменил это:

public struct PSU
{
     public CheckBox CallHostessButton0, CallHostessButton1,
     ReadLightButton0, ReadLightButton1, ReadLightButton2, ReadLightButton3;
     public PictureBox BeltLight, SmokeLight;
 }

 public void AssignObjectsToPSU(UniversalVariables.PSU psu, CheckBox 
 CallHostessBtn0, EventHandler HBtn0CheckedChanged, CheckBox 
 CallHostessBtn1, EventHandler HBtn1CheckedChanged)
 {
 // and i'm trying to do this in my function:
 ...
 psu.CallHostessButton0 = CallHostessBtn0;
 psu.CallHostessButton0.CheckedChanged += new EventHandler(HBtn0CheckedChanged); 
 ...
 }

на это:

//UniversalVariables.cs
public class PSU
{
    public CheckBox CallHostessButton0, CallHostessButton1,
        ReadLightButton0, ReadLightButton1, ReadLightButton2, ReadLightButton3;
    public PictureBox BeltLight, SmokeLight;

    public PSU(CheckBox CallHostBtn0, CheckBox CallHostBtn1, CheckBox ReadLightBtn0, CheckBox ReadLightBtn1,
        PictureBox BeltLght, PictureBox SmokeLght, [Optional] CheckBox ReadLightBtn2, [Optional] CheckBox ReadLightBtn3)
    {
        Log("[Info] Assigning objects to PSU unit...");
        CallHostessButton0 = CallHostBtn0;
        CallHostessButton1 = CallHostBtn1;
        ReadLightButton0 = ReadLightBtn0;
        ReadLightButton1 = ReadLightBtn1;

        if (CallHostessButton0 == null || CallHostessButton1 == null || ReadLightButton1 == null || ReadLightButton0 == null)
        {
            LogReport("[Failed]");
        }

        else { LogReport("[OK]"); }

        if (ReadLightBtn2 != null)
        {
            Log(String.Format("[Info] Extra {0} detected...", nameof(ReadLightBtn2)));
            this.ReadLightButton2 = ReadLightBtn2;
            LogReport("[OK]");

            if(ReadLightBtn3 != null)
            {
                Log(String.Format("[Info] Extra {0} detected...", nameof(ReadLightBtn3)));
                this.ReadLightButton3 = ReadLightBtn3;
                LogReport("[OK]");
            }
        }

        this.BeltLight = BeltLght; this.SmokeLight = SmokeLght;
    }

КогдаВы хотите определить новый блок питания, вам просто нужно сделать это в коде вашей формы следующим образом:

 // Interface.cs
 UniversalVariables.PSU[] TestPSU = new UniversalVariables.PSU()cb_CallHost0, cb_CallHost1, cb_ReadLight0, cb_ReadLight1, pb_BeltLghtTest, pb_SmkLghtTest);

Или вам нужен массив блоков питания (или что-то подобное для вашего проекта):

 //Interface.cs
 UniversalVariables.PSU[] TestPSU = new UniversalVariables.PSU[12];
 TestPSU[<indexOfYourPSU>] = new UniversalVariables.PSU(cb_CallHost0, cb_CallHost1, cb_ReadLight0, cb_ReadLight1, pb_BeltLghtTest, pb_SmkLghtTest);

И это сработало успешно :) Надеюсь, этот опыт кому-нибудь поможет.Хорошего дня ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...