Делегировать ссылку на NULL - PullRequest
1 голос
/ 29 мая 2020

У меня проблема с делегатами, которые ссылаются на null, у меня есть это:

Сначала я определяю делегата, который будет действовать:

    public delegate void MandarComponente(int Componente);
    public event MandarComponente MandarComp;

Как я хочу, чтобы это было в операции перетаскивания, я собираюсь поместить некоторые важные вещи в код перетаскивания + падение

        private void Capacitor_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) //This is a PictureBox Event
    {
        componente = 1;
        Capacitor.DoDragDrop(Capacitor.Image, DragDropEffects.Copy | DragDropEffects.Move);
    }
* 1009 будет использовать его в событии
public void tableLayoutPanel2_DragDrop(object sender, DragEventArgs e)
    {
        Point pl = new Point(this.Location.X + tableLayoutPanel2.Location.X + 10, this.Location.Y + tableLayoutPanel2.Location.Y + 32);
        int R = (int)((e.Y - pl.Y) / pictureBox1.Height);
        int C = (int)((e.X - pl.X) / pictureBox1.Width);
        Console.WriteLine("X=" + e.X + "Y=" + e.Y + " [" + C + ", " + R + "]");

        if (R == tableLayoutPanel2.RowCount) R--;
        if (C == tableLayoutPanel2.ColumnCount) C--;

        PictureBox pictureBox = (PictureBox)tableLayoutPanel2.GetControlFromPosition(C, R);

        if (R == 0 && C == 0 || R == 2 && C == 0 || R == 2 && C == 2 || R == 0 && C == 2)
        {
            MessageBox.Show("¡No puedes poner un componente ahí!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            pictureBox = null;
        }


        if (componente == 1 && pictureBox != null)
        {
                pictureBox.Image = Capacitor.Image;
                MandarComp(componente);
                MandarComp = new MandarComponente(CambiarTexto);

                if (R == 1 && C == 2 || R == 1 && C == 0)
                {
                    pictureBox.Image.RotateFlip(RotateFlipType.Rotate90FlipNone);
                }
        }

Это относится к этому методу:

    void CambiarTexto(int Componente)
    {
        if(Componente==1)
        {
            label5.Text = "Componente Seleccionado: CAPACITOR";
        }

    }

Но часть MandarCom(Componente) всегда имеет исключение NullReferenceException.

Edit: в основном то, что я пытаюсь сделать, это то, что делегат MandarComponente(int Componente) сохраняет componente и затем отправляет его методу CambiarTexto, чтобы он выполнял действие в label5.Text.

1 Ответ

0 голосов
/ 29 мая 2020

Для использования события, прежде чем вы его вызовете, вы должны сначала присвоить ему значение, что означает, что индекс вашего assignemnt и вызова неверен. это должно быть:

MandarComp += CambiarTexto;//For event, += is used more offen than directly assignment.
MandarComp(Componente);

Это должно работать.

Кроме того, если вы используете последнюю версию C#, это позволяет вам писать вот так MandarComp?.Invoke(), чтобы избежать NullReferenceExcption.

Более того, я также предлагаю вам начать с некоторого c базового использования делегата и события. Если ваш делегат просто используется в классе владельца, это своего рода трата. Прямой вызов этого метода приведет к тому же результату.

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