我有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; }
}
}
问题是,当我点击产品时,列表为空。我如何解决它?
答案 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)
});
}