无法在班级列表中获得价值

时间:2015-12-09 12:24:22

标签: c# list class

我有1个课程和2个表格

主窗体将从数据库

列表中加载产品
for (int i = 1; i < TileProduct.Length; i++)
{
    SqlConnection conn = new SqlConnection();
    SqlCommand cmd = new SqlCommand();

    conn.ConnectionString = @"source;" + "integrated security=true";
    cmd.Connection = conn;

    string query = "Select Product_Name, Price, Description, Image from Product where Product_ID = @id ";
    using (var command = new SqlCommand(query, conn))
    {
        conn.Open();
        command.Parameters.AddWithValue("@id", i);
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                fill.FillProduct.Add(new product
                {
                    Name = reader.GetString(0),
                    Price = reader.GetDecimal(1),
                    Description = reader.GetString(2),
                    Image = reader.GetString(3)
                });
            }
        }

        conn.Close();
    }

    string id = Convert.ToString(i);

        var Tile = new PictureBox(); 
        TileProduct[i] = Tile;
        Tile.Text = id;
    Tile.Click += (s, e) => {
            item ShowPro = new item((Convert.ToInt32(Tile.Text)-1));
            ShowPro.StyleManager = metroStyleManager;
            ShowPro.metroStyleManager1.Style = metroStyleManager.Style;
            ShowPro.metroStyleManager1.Theme = metroStyleManager.Theme;
            ShowPro.ShowDialog();
        };
    Tile.Image = Image.FromFile(fill.FillProduct[Convert.ToInt32(Tile.Text) - 1].Image);
    Tile.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
    Tile.Location = new Point((3 + add), 11);
        Tile.Size = new Size(100, 100);
        Shop.Controls.Add(TileProduct[i]);
    add = 120*i;
}

点击产品后,它会传递产品编号,并打开一个包含此代码的新表单。

public item(int productNo)
{
    InitializeComponent();
    product fill = new product();
    sProduct = (fill.FillProduct[productNo].Name);

    this.Text = sProduct;

    sPrice = fill.FillProduct[productNo].Price;
    lblPrice.Text = "$" + sPrice;

    string Desc = fill.FillProduct[productNo].Description;
    lblDesc.Text = System.IO.File.ReadAllText(@Desc);

    string Img = fill.FillProduct[productNo].Image;
    picProduct.Image = Image.FromFile(Img);
}

将要处理它的类将是

class product
{
    private List<product> Product = new List<product>();

    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Description { get; set; }
    public string Image { get; set; }

    public List<product> FillProduct
    {
        set { Product = value; }
        get { return Product; }
    }
}

问题是,当我点击产品时,列表为空。我如何解决它?

3 个答案:

答案 0 :(得分:1)

在您的代码中,您调用项目构造函数

item ShowPro = new item((Convert.ToInt32(Tile.Text)-1));

在构造函数中,您尝试使用空的属性列表。您的Product列表是item类的属性,这意味着它是为每个对象实例创建初始化的,属于该特定实例。

结果,做:

sProduct = fill.FillProduct[productNo].Name);

在构造函数中,以前没有任何内容插入到列表中,因此没有FillProduct[productNo]值,因此Name索引和其他属性应该导致NullReferenceException

另外,请考虑查看C# coding style conventions。类名和属性被认为具有第一个大写的名称,其中局部变量是小写的,都遵循camelcase。

更新:我刚刚注意到你在fill.FillProduct.Add(....)循环中使用while (reader.Read())(我猜填充是一个属性或字段,因为我在你的代码中看不到它的声明),然后在你的item构造函数中,你可以:

product fill = new product();

现在,您在此处初始化的填充具有与顶部声明的字段不同的范围,并且此阴影覆盖上面的一个,这意味着另一个填充对象(尽管可能存在于此范围之外)不可见,因为其变量引用被另一个对象遮蔽。 不要认为这两个引用同一个对象,因为它们根本就没有。查看here以获取有关变量范围的更多信息。

答案 1 :(得分:0)

好吧,在

while (reader.Read())
{
    fill.FillProduct.Add(new product
    {
        Name = reader.GetString(0),
        Price = reader.GetDecimal(1),
        Description = reader.GetString(2),
        Image = reader.GetString(3)
    });
}

你有这个fill变量似乎包含从查询返回的所有产品。当我读到它时,单击磁贴时,item代码就是新的形式。您是否实际将fill变量传递给新表单? fill是全球性的吗?如果是这样,它会被项目方法中的product fill = new product();覆盖。

答案 2 :(得分:0)

以某种方式回答您的问题,以便了解您的错误,这是您所做的事情的简要示例:

var A= new Car();
A.myFriends = fillCarWithFriends(); 

int seatNr = getSelectedFriendSeatNrFrom(A);

var B= new Car();
var myFriend = B.myFriends [seatNr];

这意味着你要建造2辆汽车(A和B)。然后填充汽车A,让我们说朋友,现在你正试图在汽车B找到一个朋友,而他在车里A

要做你想做的事,你需要改变:

public List<product> FillProduct
{
    set { Product = value; }
    get { return Product; }
}

public static List<product> FillProduct
{
    set { Product = value; }
    get { return Product; }
}

现在您可以在不需要对象的情况下访问FillProduct  在这种情况下调用product.FillProduct product是一种类型而不是对象

更改的项目方法如下:

public item(int productNo)
{
    InitializeComponent();

    var selectedProduct = product.FillProduct[productNo];

    sProduct = (selectedProduct.Name);
    this.Text = sProduct;

    sPrice = selectedProduct.Price;
    lblPrice.Text = "$" + sPrice;

    string Desc = selectedProduct.Description;
    lblDesc.Text = System.IO.File.ReadAllText(@Desc);

    string Img = selectedProduct.Image;
    picProduct.Image = Image.FromFile(Img);
}

更改了您填写

的部分
    while (reader.Read())
    {
        product.FillProduct.Add(new product
        {
            Name = reader.GetString(0),
            Price = reader.GetDecimal(1),
            Description = reader.GetString(2),
            Image = reader.GetString(3)
        });
    }