我们刚刚开始学习winforms,我们必须制作一个模拟GUI。使用contextMenuStrip,我可以制作看起来像文件夹的新标签。
private void makeFolder(int x, int y)
{
Label lbl_folder = new Label();
lbl_folder.Location = new Point(x, y);
lbl_folder.Width = 75;
lbl_folder.Height = 75;
lbl_folder.BackColor = Color.Transparent;
lbl_folder.Image = Properties.Resources.folder;
lbl_folder.Text = "New Folder" + folderindex;
lbl_folder.TextAlign = ContentAlignment.BottomCenter;
canvas.Controls.Add(lbl_folder);
folderindex++;
lbl_folder.ContextMenuStrip = folderMenuStrip; //so I can use another contextMenuStrip on them
}
如果在这些文件夹中使用了另一个contextMenuStrip,我想要删除右键单击的文件夹,但我无法访问lbl_folder。
//I would like to do something like this
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
lbl_folder.Hide();
}
名称lbl_folder在当前上下文中不存在。我该如何解决这个问题?
答案 0 :(得分:2)
您在本地范围内(在方法内)声明了lbl_folder
,因此您只能在其中使用该变量。您有两种选择:
在表单范围内声明变量。因此,将行Label lbl_folder = new Label();
移到makeFolder
之外。
private Label lbl_folder = null;
private void makeFolder(int x, int y)
{
lbl_folder = new Label();
在deleteToolStripMenuItem_Click
内,通过表单ControlCollection检索对同一控件的新引用,例如
var lbl = this.Controls.Find("NameOfControl", true)[0] as Label;
或
var lbl = this.Controls.Find("NameOfControl", true).OfType<Label>().Single();
...取决于你对LINQ的舒适程度。
您可能也可以更有效地从canvas
获取,具体取决于canvas
作用域的范围。
var lbl = canvas.Controls.Find("NameOfControl")[0] as Label.
答案 1 :(得分:0)
这是关于标签范围的问题。如果它们是在makeFolder
方法中声明的,则无法从方法外部访问它们。
如果您不想使用Container的FindControls
方法。然后,您可以保留对在hashtable
或字典中创建的标签的引用,该字典在表单中声明为实例属性。
然后,在makeFolder
中添加标签。
lbl_folder.Name = folderindex;
hashtable.Add(lbl_folder.Name, lbl_folder);
从表单的任何位置,您都可以从哈希表中获取标签并修改其属性。
答案 2 :(得分:0)
由于您是动态创建标签并将上下文菜单附加到每个标签,我怀疑您真正想要的是删除菜单项以引用您右键单击的标签。
在这种情况下,您可以使用ContextMenuStrip的SourceControl来提供:
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
((Label)folderMenuStrip.SourceControl).Visible = false;
}
答案 3 :(得分:0)
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
var menuItem = sender as ToolStripMenuItem;
var menu = menuItem.GetCurrentParent() as ContextMenuStrip;
var label = menu.SourceControl as Label;
label.Visible = false;
}
答案 4 :(得分:0)
您也可以在makeFolder
方法中执行此操作:
lbl_folder.Click += (s, e) => lbl_folder.Hide();
我知道这不是您尝试回复的事件,但它应该可以帮助您了解如何做到这一点。
所以你的方法看起来像:
private void makeFolder(int x, int y)
{
Label lbl_folder = new Label();
lbl_folder.Location = new Point(x, y);
lbl_folder.Width = 75;
lbl_folder.Height = 75;
lbl_folder.BackColor = Color.Transparent;
lbl_folder.Image = Properties.Resources.folder;
lbl_folder.Text = "New Folder" + folderindex;
lbl_folder.TextAlign = ContentAlignment.BottomCenter;
lbl_folder.Click += (s, e) => lbl_folder.Hide();
canvas.Controls.Add(lbl_folder);
folderindex++;
lbl_folder.ContextMenuStrip = folderMenuStrip;
}
无论您调用此方法多少次以及创建了多少个文件夹,这都可以正常工作。