C# c中的ContextMenuStrip事件处理程序#
我想将ContextMenyStrip事件处理程序附加到每个创建的picturebox,如果它的名称是“合并”。下面是代码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
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”,还有什么可以替代它呢。