C# c中的ContextMenuStrip事件处理程序#

C# c中的ContextMenuStrip事件处理程序#,c#,winforms,C#,Winforms,我想将ContextMenyStrip事件处理程序附加到每个创建的picturebox,如果它的名称是“合并”。下面是代码 public partial class Form1 : Form { public NetworkArea n; Components sp1; Components sp2; int s = 0; int p = 0; PictureBox pb; Merger mg; public For

我想将ContextMenyStrip事件处理程序附加到每个创建的picturebox,如果它的名称是“合并”。下面是代码

public partial class Form1 : Form
{
    public NetworkArea n;
    Components sp1;
    Components sp2;
    int s = 0;
    int p = 0;
    PictureBox pb;
    Merger mg;
            public Form1()
    {
        InitializeComponent();
        pb = new PictureBox();
       // pb.Name = "Merger";
        mg = null;
        n = new NetworkArea();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        panel1.AllowDrop = true;

        pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);

        pictureBox2.MouseDown += new MouseEventHandler(pictureBox2_MouseDown);
        pictureBox3.MouseDown += new MouseEventHandler(pictureBox3_MouseDown);
        pictureBox4.MouseDown += new MouseEventHandler(pictureBox4_MouseDown);
        pictureBox5.MouseDown += new MouseEventHandler(pictureBox5_MouseDown);

        panel1.DragEnter += new DragEventHandler(panel1_DragEnter);
        this.panel1.DragDrop += new DragEventHandler(panel1_DragDrop);
        panel1.GiveFeedback += new GiveFeedbackEventHandler(panel1_GiveFeedback);

    }


    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {

        if (e.Button == MouseButtons.Left)
        {
            var dragImage = (Bitmap)pictureBox1.Image;
            IntPtr icon = dragImage.GetHicon();
            Cursor.Current = new Cursor(icon);
            DoDragDrop(pictureBox1.Image, DragDropEffects.Copy);

            pb.Name = "Pump";

        }
    }
    void contexMenuuu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        ToolStripItem item = e.ClickedItem;
        // your code here
    }
    private void panel1_DragDrop(object sender, DragEventArgs e)
    {


        pb.Image = (Bitmap)e.Data.GetData(DataFormats.Bitmap);

         pb.Size = new System.Drawing.Size(50,50);
         pb.SizeMode = PictureBoxSizeMode.StretchImage;
        pb.Location = panel1.PointToClient(new Point(e.X - pb.Width / 2, e.Y - pb.Height / 2));
        panel1.Controls.Add(pb);

        if (pb.Name == "Pump")
        {
            label3.Text = "Pump" + pb.Location.X + " " + pb.Location.Y;


        }

            if (pb.Name == "Splitter")
            {
                label3.Text = "Splitter" + pb.Location.X + " " + pb.Location.Y;
            }
            if (pb.Name == "AdSplitter")
            {
                label3.Text = "AdSplitter" + pb.Location.X + " " + pb.Location.Y;
            }
            if (pb.Name == "Merger")
            {
                label3.Text = "Merger" + pb.Location.X + " " + pb.Location.Y;
                mg = new Merger(pb.Location.X, pb.Location.Y);
                pb.ContextMenuStrip = new ContextMenuStrip();
                pb.ContextMenuStrip.ItemClicked += new ToolStripItemClickedEventHandler(contexMenuuu_ItemClicked);
                pb.ContextMenuStrip.Items.Add("Change");

                // 
                }
            if (pb.Name == "Sink")
            {
                label3.Text = "Sink" + pb.Location.X + " " + pb.Location.Y;
                pb.ContextMenuStrip.ItemClicked -= new ToolStripItemClickedEventHandler(contexMenuuu_ItemClicked);
            }

        pb = new PictureBox(); 

    }

    private void panel1_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.Bitmap))
        {
            e.Effect = DragDropEffects.Copy;

        }
        else
        {
            e.Effect = DragDropEffects.None;
        }
    }


    private void panel1_GiveFeedback(object sender, GiveFeedbackEventArgs e)
    {
        e.UseDefaultCursors = false;
    }

    private void pictureBox2_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            var dragImage = (Bitmap)pictureBox2.Image;
            IntPtr icon = dragImage.GetHicon();
            Cursor.Current = new Cursor(icon);
            DoDragDrop(pictureBox2.Image, DragDropEffects.Copy);

            pb.Name ="Splitter";

        }
    }

    private void pictureBox3_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            var dragImage = (Bitmap)pictureBox3.Image;
            IntPtr icon = dragImage.GetHicon();
            Cursor.Current = new Cursor(icon);
            DoDragDrop(pictureBox3.Image, DragDropEffects.Copy);

            pb.Name = "AdSplitter";

        }
    }

    private void pictureBox4_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            var dragImage = (Bitmap)pictureBox3.Image;
            IntPtr icon = dragImage.GetHicon();
            Cursor.Current = new Cursor(icon);
            DoDragDrop(pictureBox4.Image, DragDropEffects.Copy);

            pb.Name = "Merger";

        }

    }

    private void pictureBox5_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            var dragImage = (Bitmap)pictureBox3.Image;
            IntPtr icon = dragImage.GetHicon();
            Cursor.Current = new Cursor(icon);
            DoDragDrop(pictureBox5.Image, DragDropEffects.Copy);

            pb.Name = "Sink";

        }
    }





    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        //Graphics gr = e.Graphics;
        //ImageList il = new ImageList();

        //il.ImageSize = new Size(50, 50);
        //il.Images.Add(Image.FromFile("../../../images/1Merger.png"));
        //gr.DrawImage(il.Images[0], 30, 109);
        //mg = new Merger(30, 109);
    }


}
问题是,如果我拖放一个合并,那么它没有上下文菜单,但在那之后,每个合并都会有上下文菜单。然后在拖放另一个picturebox(不是合并)之后,如果我再次拖放合并picturebox,它不会显示任何上下文菜单,但在此之后,其余合并都有此菜单。 有人能告诉我这些代码有什么问题吗?
提前感谢

“为创建的每个picturebox”是这段代码中的问题,实际上您根本不创建任何picturebox。你反复使用某种神秘的“pb”变量。代码太过复杂,无法猜测意图是什么,当您将PictureBox对象传递给DoDragDrop()而不是图像时,您可能会领先,因此您将实际将PictureBox移动到面板。或者您确实创建了一个新的PictureBox,至少Name属性对检查它的来源很有用。您可以重新检查代码。现在我已经上传了整个类。Picture box是在DoDragDrop()的末尾创建的。你必须删除“pb”变量才能继续,这是非常邪恶的。为什么你认为我应该扔掉“pb”以及其他什么应该替换它。对于创建的每个picturebox,“picturebox”是这段代码中的问题,实际上你根本没有创建任何picturebox。你反复使用某种神秘的“pb”变量。代码太过复杂,无法猜测意图是什么,当您将PictureBox对象传递给DoDragDrop()而不是图像时,您可能会领先,因此您将实际将PictureBox移动到面板。或者您确实创建了一个新的PictureBox,至少Name属性对检查它的来源很有用。您可以重新检查代码。现在我已经上传了整个课程。图片框是在DoDragDrop()的末尾创建的。你必须删除“pb”变量才能获得成功,这是非常邪恶的。你为什么认为我应该扔掉“pb”,还有什么可以替代它呢。