【问题标题】:C# object connection with dynamic labels in dynamic objectsC# 对象连接与动态对象中的动态标签
【发布时间】:2018-04-28 14:40:03
【问题描述】:

我创建了一个动态表单,其中包含动态对象。但是由于某种原因,当我创建动态事件处理程序时,事件处理程序不会获取动态对象。也就是说,它们不会出现在 Visual Studios 的选项下拉列表中。

代码:

private void btnShop_Click(object sender, EventArgs e)
    {
        Form frmShop = new Form();
        frmShop.Show();

        Button newButton = new Button();
        Button Add = new Button();
        Label Meat = new Label();
        Label Carrots = new Label();
        Label DogFood = new Label();
        Label Fish = new Label();
        Label Rainbows = new Label();

        frmShop.Controls.Add(Meat);
        frmShop.Controls.Add(Carrots);
        frmShop.Controls.Add(DogFood);
        frmShop.Controls.Add(Fish);
        frmShop.Controls.Add(Rainbows);

        frmShop.Controls.Add(newButton);
        frmShop.Controls.Add(Add);

        frmShop.Size = new Size(300,300);

        //HERE IS MY PROBLEM v //
        frmShop.Controls.Add(lblCount) 
    }

【问题讨论】:

  • lblCount 是什么,您有什么问题?你有错误吗?
  • 变量 Rainbow 是 btnShop_Click 的本地变量,您不能使用它的名称,希望您可以引用标签的方法和属性。您需要将控件移动到全局范围或为它们命名并从表单控件集合中检索它们
  • @CodingYoshi 抱歉,再次编辑。基本上,当单击动态创建的按钮时,标签 Rainbows 的文本必须更改。但是当我开始在我显示我想要它的地方输入 Rainbows 时,Rainbows 标签不会出现。当我完全输入它时,它只会给我错误“当前上下文中不存在名称'Rainbows'。
  • @Steve 是的!我在编码方面很菜鸟,我该如何解决?如何将其移动到全局范围?

标签: c# visual-studio visual-studio-2015 connection


【解决方案1】:

变量 Rainbow 是 btnShop_Click 事件处理程序的本地变量,即使您使用相同的名称,也不能在其他方法中使用此变量。 Learn about scoping here

您需要将您的控件移动到全局范围或给它们一个名称并从表单控件集合中检索它们。

例如,将接收动态表单的变量移动到全局范围(在任何类方法之外但在类声明内)

private Form frmShop = null;

private void btnShop_Click(object sender, EventArgs e)
{
    frmShow = new Form();
    .....

    // Set the Name property for the label
    Label Rainbow = new Label { Name = "Rainbow" }
    ...

    frmShow.Controls.Add(Rainbow);


}

protected void newButton_Click(object sender, EventArgs e)
{
    ...

    // Try to extract the label required from the form controls collection
    // using the specified name
    Label aRainbowLabel = frmShow.Controls
                                 .OfType<Label>()
                                 .FirstOrDefault(x=>x.Name=="Rainbow");
    aRainbowLabel.Text = "Rainbows: 1";
} 

请注意,您在这里走的是一条危险的道路。变量 frmShow 是全局变量,如果再次单击同一个按钮,您将创建具有相同元素的第二个表单。如果这没问题,那么没问题,但是如果您只想要一种这种形式,则需要在创建表单之前检查变量是否为 null,如果关闭该表单,请将变量 frmShow 设置回 null。

【讨论】:

    猜你喜欢
    • 2020-10-29
    • 1970-01-01
    • 2023-03-14
    • 2020-09-16
    • 1970-01-01
    • 2013-04-16
    • 2011-03-27
    • 2014-06-03
    • 2012-12-15
    相关资源
    最近更新 更多