无法引用方法中创建的标签

时间:2017-10-31 16:14:00

标签: c# winforms

我们刚刚开始学习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在当前上下文中不存在。我该如何解决这个问题?

5 个答案:

答案 0 :(得分:2)

您在本地范围内(在方法内)声明了lbl_folder,因此您只能在其中使用该变量。您有两种选择:

  1. 在表单范围内声明变量。因此,将行Label lbl_folder = new Label();移到makeFolder之外。

    private Label lbl_folder = null;
    
    private void makeFolder(int x, int y)
    {
        lbl_folder = new Label();
    
  2. 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;
}

无论您调用此方法多少次以及创建了多少个文件夹,这都可以正常工作。