WinForms - 使用列数未知的列表创建和填充 DataGridView
WinForms - Creating and populating a DataGridView with a List of unknown number of columns
大家好
我真的不知道我是否能够解释自己,但我们开始吧:
我制作了一个 winforms 应用程序,可以捕获不同商店中相同产品的价格。代码已经以我可以添加更多商店的方式进行了优化。
产品class是这样的:
public enum EnumMercado { Extra = 1, Dia = 8, Carrefour = 9, BIG = 10, Pao = 11 };
public class Produto
{
public EnumMercado Mercado { get; set; }
public string IDProduto { get; set; }
public string NomeProduto { get; set; }
public bool Disponivel { get; set; }
public decimal? Preco_de { get; set; }
public decimal Preco_por { get; set; }
public Bitmap ProductImage { get; set; }
public bool Erro_Captura { get; set; }
public String ErrorMessage { get; set; }
public Produto()
{
Erro_Captura = false;
ErrorMessage = string.Empty;
}
}
这是我用来填充单个产品搜索的 class:
public class PesquisaGeral
{
public PRODUTOS Produto { get; set; }
public List<Produto> Cotacoes { get; set; }
public PesquisaGeral()
{
Cotacoes = new List<Produto>();
}
}
PRODUTOS 是一个实体 class(SQL 上的产品 ID 和 SQL 中的产品名称)
Cotacoes 是一个 Produto 列表(针对该产品所链接的每个商店)
要获得完整的产品 x 价格,我有一个 PesquisaGeral 列表
现在开始提问
在我的 DataGridView 中,我想以这种方式填充:
Headers:
[商品]、[店铺名称1]、[店铺名称2]、[店铺名称3]....[数量]
值:
[产品 1] [2.66] [2.94] [1.98].....[可编辑文本框]
我已经使用 DataTable 完成了这项工作,根据商店数量、产品名称和数量动态创建列。
那是“好的”
有没有办法在不使用数据表的情况下实现这一点?
是否可以动态创建一个 List 来计算商店数量并以水平方式创建命名 objects(可能是匿名)的数量?
我想要完成的是这样的:
记住:public enum EnumMercado { Extra = 1, Dia = 8, Carrefour = 9, BIG = 10, Pao = 11 };
var a = getmyCotacoes();
如果我将鼠标指向 运行 响应,我希望能够看到一个“某物列表”,每个东西将显示为(可能是匿名列表):
产品:“产品 1”
额外:2.1
Dia:2.15
Carrefour:3.7
BIG:2.1
Pao:2.25
Quantity:0
今天我有这些商店,但是这会增加,我不想每次添加商店时都更改方法。
顺便说一句,抱歉我的英语不好,我是巴西人。
赞成广告
拉斐尔
您关于不想使用 DataTable 的评论没有意义; datatables/datarows 可以被子classed 以创建自定义 class 就像您对 List 的建议解决方案所做的那样,因此您可以获得 datatable 的所有功能加上任何东西你想从你的习惯 class。 Visual studio 甚至有一个用于创建自定义数据table 和数据行的内置设备,以便可以构建强类型数据访问层(通常用于数据库,但不一定是)
关于必须加入原始搜索结果的评论也没有意义;数据table 不是您的数据库table,并且可以包含比您的数据库更少或更多的列。例如,您的 select 可能是 SELECT ID as ProductId, Nome, Preco FROM products WHERE Nome LIKE 'Jamon%'
,所以是三列,而您的数据 table 可能有 ProductId, Nome, Quantidade, Preco, PrecoTotal
列,所以是 5 列,而 PrecoTotal 的表达式可能是 "[Preco] * [Quantidade]"
所以它会自动计算。 quantity 列是查询没有取到,所以用户填写了。只有填写了quantity 才计算总数..
我觉得说到用不用datatable的问题,更多的是你没有完全正确地使用它们,或者没有完全理解它们的工作原理;我确信他们可以解决您的问题,但我们只需要确定实际问题
您的实际问题似乎是“我如何拥有可变数量的商店”- 如果您将商店保留在枚举 (MercadoEnum) 中,这将非常困难,因为枚举已编译到程序中。要添加新商店,您必须发布新程序。相反,您的商店应该是数据库中的 table,就像您的产品一样。您应该有另一个 table 将商店链接到产品,并且特定产品的价格将存储在此 table 中,因为即使每个商店都可能出售牛奶,但它们都以不同的价格出售。当你查询你的船和价格时,你基本上会得到一个相同产品的产品列表,以及一堆不同的价格,但重要的是 你会以行 的形式返回价格 - 如果有 5 家商店卖一个产品你得到 5 行。如果两家商店出售一种产品,您将返回两行。你是说你想要这些作为 columns - 我们通常称之为枢轴,我们将可变数量的行转换为可变数量的列。这样做时要小心,因为它并不总是明智的。列通常被认为是事物的属性,事物通常不具有无限可变数量的属性 -
像这样对它们建模会使它们更难使用
这种情况下还是可以的;您在每家商店都有一个价格列,您可以在数据库或代码中执行数据透视表,可能是通过将数据 table 与我作为密钥的产品进行比较,然后添加一个新列每次遇到不认识的店铺。您最终会得到一行,每个产品在每个商店中都有一组价格。如果您有多种产品,那么如果不是每个商店都销售每种产品,那么您可能会有很多空白
请注意,当我说商店时,我的意思是“nation-wide 连锁商店”- 我在那个 mercado 列表中认出了家乐福,他们有很多分店,甚至可能每个分店都以不同的方式销售一些产品。也许甚至产品链接应该在分支机构级别(城镇中的建筑物)而不是 group-of-shops 级别完成,以允许不同的位置以不同的价格存储不同的产品
你的第一个问题不是“数据table做不到”,而是数据建模;您的程序还没有完全正确的数据建模
大家好
我真的不知道我是否能够解释自己,但我们开始吧:
我制作了一个 winforms 应用程序,可以捕获不同商店中相同产品的价格。代码已经以我可以添加更多商店的方式进行了优化。
产品class是这样的:
public enum EnumMercado { Extra = 1, Dia = 8, Carrefour = 9, BIG = 10, Pao = 11 };
public class Produto
{
public EnumMercado Mercado { get; set; }
public string IDProduto { get; set; }
public string NomeProduto { get; set; }
public bool Disponivel { get; set; }
public decimal? Preco_de { get; set; }
public decimal Preco_por { get; set; }
public Bitmap ProductImage { get; set; }
public bool Erro_Captura { get; set; }
public String ErrorMessage { get; set; }
public Produto()
{
Erro_Captura = false;
ErrorMessage = string.Empty;
}
}
这是我用来填充单个产品搜索的 class:
public class PesquisaGeral
{
public PRODUTOS Produto { get; set; }
public List<Produto> Cotacoes { get; set; }
public PesquisaGeral()
{
Cotacoes = new List<Produto>();
}
}
PRODUTOS 是一个实体 class(SQL 上的产品 ID 和 SQL 中的产品名称)
Cotacoes 是一个 Produto 列表(针对该产品所链接的每个商店)
要获得完整的产品 x 价格,我有一个 PesquisaGeral 列表
现在开始提问
在我的 DataGridView 中,我想以这种方式填充:
Headers:
[商品]、[店铺名称1]、[店铺名称2]、[店铺名称3]....[数量]
值:
[产品 1] [2.66] [2.94] [1.98].....[可编辑文本框]
我已经使用 DataTable 完成了这项工作,根据商店数量、产品名称和数量动态创建列。
那是“好的”
有没有办法在不使用数据表的情况下实现这一点? 是否可以动态创建一个 List 来计算商店数量并以水平方式创建命名 objects(可能是匿名)的数量?
我想要完成的是这样的:
记住:public enum EnumMercado { Extra = 1, Dia = 8, Carrefour = 9, BIG = 10, Pao = 11 };
var a = getmyCotacoes();
如果我将鼠标指向 运行 响应,我希望能够看到一个“某物列表”,每个东西将显示为(可能是匿名列表):
产品:“产品 1”
额外:2.1
Dia:2.15
Carrefour:3.7
BIG:2.1
Pao:2.25
Quantity:0
今天我有这些商店,但是这会增加,我不想每次添加商店时都更改方法。
顺便说一句,抱歉我的英语不好,我是巴西人。
赞成广告
拉斐尔
您关于不想使用 DataTable 的评论没有意义; datatables/datarows 可以被子classed 以创建自定义 class 就像您对 List 的建议解决方案所做的那样,因此您可以获得 datatable 的所有功能加上任何东西你想从你的习惯 class。 Visual studio 甚至有一个用于创建自定义数据table 和数据行的内置设备,以便可以构建强类型数据访问层(通常用于数据库,但不一定是)
关于必须加入原始搜索结果的评论也没有意义;数据table 不是您的数据库table,并且可以包含比您的数据库更少或更多的列。例如,您的 select 可能是 SELECT ID as ProductId, Nome, Preco FROM products WHERE Nome LIKE 'Jamon%'
,所以是三列,而您的数据 table 可能有 ProductId, Nome, Quantidade, Preco, PrecoTotal
列,所以是 5 列,而 PrecoTotal 的表达式可能是 "[Preco] * [Quantidade]"
所以它会自动计算。 quantity 列是查询没有取到,所以用户填写了。只有填写了quantity 才计算总数..
我觉得说到用不用datatable的问题,更多的是你没有完全正确地使用它们,或者没有完全理解它们的工作原理;我确信他们可以解决您的问题,但我们只需要确定实际问题
您的实际问题似乎是“我如何拥有可变数量的商店”- 如果您将商店保留在枚举 (MercadoEnum) 中,这将非常困难,因为枚举已编译到程序中。要添加新商店,您必须发布新程序。相反,您的商店应该是数据库中的 table,就像您的产品一样。您应该有另一个 table 将商店链接到产品,并且特定产品的价格将存储在此 table 中,因为即使每个商店都可能出售牛奶,但它们都以不同的价格出售。当你查询你的船和价格时,你基本上会得到一个相同产品的产品列表,以及一堆不同的价格,但重要的是 你会以行 的形式返回价格 - 如果有 5 家商店卖一个产品你得到 5 行。如果两家商店出售一种产品,您将返回两行。你是说你想要这些作为 columns - 我们通常称之为枢轴,我们将可变数量的行转换为可变数量的列。这样做时要小心,因为它并不总是明智的。列通常被认为是事物的属性,事物通常不具有无限可变数量的属性 - 像这样对它们建模会使它们更难使用
这种情况下还是可以的;您在每家商店都有一个价格列,您可以在数据库或代码中执行数据透视表,可能是通过将数据 table 与我作为密钥的产品进行比较,然后添加一个新列每次遇到不认识的店铺。您最终会得到一行,每个产品在每个商店中都有一组价格。如果您有多种产品,那么如果不是每个商店都销售每种产品,那么您可能会有很多空白
请注意,当我说商店时,我的意思是“nation-wide 连锁商店”- 我在那个 mercado 列表中认出了家乐福,他们有很多分店,甚至可能每个分店都以不同的方式销售一些产品。也许甚至产品链接应该在分支机构级别(城镇中的建筑物)而不是 group-of-shops 级别完成,以允许不同的位置以不同的价格存储不同的产品
你的第一个问题不是“数据table做不到”,而是数据建模;您的程序还没有完全正确的数据建模