在创建它的方法之外访问动态控件

时间:2010-10-22 03:35:21

标签: c# winforms

请帮忙!我不知道这可能是太简单了,但我无法做到正确,似乎无法在其他帖子上找到正确的答案。我对C#比较陌生,我只是为了爱好而编程,这是我的第一篇文章。

我在类Met中有这个方法CreateMap(),我有我所有的方法。它创建了一个动态自定义控件(stockBox [])数组,并将它们添加到Form中的表格布局面板(boxContainer)中。该方法在应用程序打开时运行。我得到了一切正常工作,问题是我想从同一个类中的另一个方法访问stockBox控件我看不到带有IntelliSense的stockBox,它说它不存在!

public static class Met
{
    public static StockBox[] CreateMap(string[] stock, TableLayoutPanel boxContainer)
    {
        StockBox[] stockBox = new StockBox[Var.stockCount + 1];

        for (int i = 1; i <= Var.stockCount; i++)
        {
            stockBox[i] = new StockBox();
            stockBox[i].StockText = stock[i];
            boxContainer.Controls.Add(stockBox[i]);
        }

        return stockBox;
    }
}

无法在方法外放置StockBox [] stockBox = new StockBox [Var.stockCount + 1],因为Var.stockCount为0,它将创建一个只有一个对象的数组。

有什么想法吗?你觉得我能做什么?提前谢谢。

3 个答案:

答案 0 :(得分:0)

确保StockBox不在类中,并且如果是,则显式声明为public。如果StockBox在met和public中,则通过调用Met.StockBox来访问它。

答案 1 :(得分:0)

有很多方法可以解决这个问题。您不能访问函数内部定义的任何变量做变量的范围。 Scope是允许变量存在于代码的有限部分中的概念。在您的情况下,您可以简单地将控件数组声明移动到类级别。但是,您必须将其设置为静态,因为您从静态类

访问它
public static class Met
{
    Static StockBox[] = null;
    public static StockBox[] CreateMap(string[] stock, TableLayoutPanel boxContainer)
    {

        stockBox = new StockBox[Var.stockCount + 1];
        for (int i = 1; i <= Var.stockCount; i++)
        {
            stockBox[i] = new StockBox();
            stockBox[i].StockText = stock[i];
            boxContainer.Controls.Add(stockBox[i]);
        }

        return stockBox;
    }
} 

答案 2 :(得分:0)

您的stockBox目前在CreateMap()中是n变量。当方法结束时(scope之外)将处理stockBox。因此,您需要将stockBox移动到类级别,如下所示:

public static class Met
{
    static StockBox[] stockBox = null;
    public static StockBox[] CreateMap(string[] stock, TableLayoutPanel boxContainer)
    {
        stockBox = new StockBox[Var.stockCount + 1];

        for (int i = 1; i <= Var.stockCount; i++)
        {
            stockBox[i] = new StockBox();
            stockBox[i].StockText = stock[i];
            boxContainer.Controls.Add(stockBox[i]);
        }

        return stockBox;
    }

    public static AccessStockBox()
    {
        if (stockBox != null)
        {
            //you should be able to access stockbox here
        }
    }
}