即使为其赋值,Product对象也是空的

时间:2012-03-27 15:40:41

标签: c# class

我有一个静态类(Argus),其中一个名为myArgus的属性是一个List,另一个名为EditProduct。在EditProduct的构造函数中,我有这一行:

// Make a copy of the product so we can easily reference it in this class
product = Argus.myArgus[Argus.branchIndex]._branchCategories[catIndex]._categoryProducts[prodIndex];

我这样做,所以我可以在我的代码中使用product._productName;而不是:

Argus.myArgus[Argus.branchIndex]._branchCategories[catIndex]._categoryProducts[prodIndex]._productName;

EditProduct表单的顶部,我正在定义此属性:

Product product = new Product();

然后,在EditProduct课程的后面,我正在这样做:

txtName.Text = product._productName;
txtDetails.Text = product._productDetails;
txtPrice.Text = product._productPrice.ToString();
txtStock.Text = product._productStockLevel.ToString();
pbProduct.ImageLocation = product._productPicLoc;

但是,表单上没有任何字段实际填充。使用断点,我发现product为空(它包含空字符串,0表示整数/双精度值)。我已经确认我在分配时指向了有效的产品。我没有错误,也没有任何关于为什么product为空的线索。 :|

如果它有帮助,这是完整的课程:

http://pastebin.com/fFDq8GxU

可能出现什么问题?感谢。

3 个答案:

答案 0 :(得分:1)

问题是,在为populateFields指定值之前,您正在呼叫product 将构造函数更改为:

public EditProduct(int catIndex, int prodIndex)
{
    InitializeComponent();

    this.catIndex = catIndex;
    this.prodIndex = prodIndex;

    // Create file handler
    fileHandler = new FileHandler(Argus.dataFileLoc);

    // Make a copy of the product so we can easily reference it in this class
    product = Argus.myArgus[Argus.branchIndex]._branchCategories[catIndex]
                                              ._categoryProducts[prodIndex];

    // This must be called after the previous line!
    populateFields();
}

答案 1 :(得分:0)

来自你的构造函数:

populateFields();

... 

// Make a copy of the product so we can easily reference it in this class
product = Argus.myArgus[Argus.branchIndex]._branchCategories[catIndex]
    ._categoryProducts[prodIndex];

因此,您在product中使用之后设置了populateFields变量。这不会起作用......

我实际上建议你甚至不在这里使用实例变量,除非你真的需要。我会将构造函数更改为...

// Ideally you should simplify this...
Product product = Argus.myArgus[Argus.branchIndex]._branchCategories[catIndex]
    ._categoryProducts[prodIndex];
PopulateFields(product);

并更改您的方法以获取参数:

private void PopulateFields(Product product)
{
    ...
}

据我所知,你没有在其他任何地方使用product,除了构造函数之外你没有调用populateFields - 所以你真的不需要它成为其中的一部分对象的状态。

答案 2 :(得分:0)

在将值放入产品之前,您调用 populateFields

这是错误的:

            populateFields();

        // Create file handler
        fileHandler = new FileHandler(Argus.dataFileLoc);

        // Make a copy of the product so we can easily reference it in this class
        product = Argus.myArgus[Argus.branchIndex]._branchCategories[catIndex]._categoryProducts[prodIndex];

这将有效:

            // Make a copy of the product so we can easily reference it in this class
        product = Argus.myArgus[Argus.branchIndex]._branchCategories[catIndex]._categoryProducts[prodIndex];

            populateFields();

        // Create file handler
        fileHandler = new FileHandler(Argus.dataFileLoc);