C# winform button click event

Vektor V 1 Reputation point
2021-10-27T07:30:48.347+00:00

When the user clicks on BtnAdd_Click() in FormB then the image displays in the PictureBox in FormA will move to the next image incrementImage().

I want to check whether the BtnAdd_Click() was clicked in FormB and passed to FormA to perform the incrementImage() function. The code that I tried below and gives an error Object reference not set to an instance of an object.

What I have tried:

FormA. cs

private FormB formB;

public FormA()
        {
            formB = new FormB();
            formB.ButtonWasClicked += new FormB.ClickButton(formB_ButtonWasClicked);
        }

void formB_ButtonWasClicked()
        {
            incrementImage();
        }

public void incrementImage()
        {

            nCurrentItem++;
            firstImage++;

            if (nCurrentItem > nTotalNumber)
                nCurrentItem = nTotalNumber;

            else if (nCurrentItem < nTotalNumber)
            {
                Image img;
                using (var bmpTemp = new Bitmap(ImageFileNames[nCurrentItem]))
                {
                    img = new Bitmap(bmpTemp);
                }
                PicBox.Image = img;

            }
            else if (nCurrentItem == nTotalNumber)
            {
                label5.Visible = true;
                endOfSession();
            }

            imgCounter.Text = firstImage.ToString() + " / " + nTotalNumber.ToString();
    }

FormB. cs

public delegate void ClickButton();
public event ClickButton ButtonWasClicked;

private void BtnAdd_Click(object sender, EventArgs e)
{

    if (listBoxFailCategories.SelectedIndex == -1)
    {
        MessageBox.Show("Please select any defect category");
    }
    else
    {
        var tempDefectCategory = "";

        foreach (string item in listBoxFailCategories.SelectedItems)
        {
            string defectFolder = Path.Combine(Value, item);
            File.Copy(Image, Path.Combine(defectFolder, Path.GetFileName(Image)), true);

            added = true;

            tempDefectCategory = tempDefectCategory + item.ToString() + ",";

            FullPathName = Path.Combine(defectFolder, Path.GetFileName(Image));

        }
        DefectCategory = tempDefectCategory;
        File.Delete(Image);

        ButtonWasClicked(); //error here

        this.Close();

    }
}
C#
C#
An object-oriented and type-safe programming language that has its roots in the C family of languages and includes support for component-oriented programming.
10,190 questions
0 comments No comments
{count} votes

1 answer

Sort by: Most helpful
  1. Karen Payne MVP 35,026 Reputation points
    2021-10-27T10:28:47.343+00:00

    You need to do ButtonWasClicked?.Invoke();

    The following project is a good example of working with delegates/events between forms.

    0 comments No comments