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做不到”,而是数据建模;您的程序还没有完全正确的数据建模