WinForms-使用未知列数列表创建和填充DataGridView

问题描述

大家好

我真的不知道我是否能够解释自己,但是我们开始:

我制作了一个winforms应用,该应用捕获了不同商店中相同产品的价格。该代码已经过优化,可以添加更多商店。

产品类别如下:

    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;
        }
    }

这是我用来填充单个产品搜索的类:

    public class PesquisaGeral
    {
        public PRODUTOS Produto { get; set; }
        public List<Produto> Cotacoes { get; set; }
        public PesquisaGeral()
        {
            Cotacoes = new List<Produto>();
        }
    }

PRODUTOS是一个Entity类(sql上的产品ID和sql中的产品名称
Cotacoes是产品列表(针对与该产品链接的每个商店)

要获得完整的产品x价格,我要列出PesquisaGeral

现在问题开始了

在我的DataGridView中,我想以这种方式填充:

标题
[产品],[商店名称1],[商店名称2],[商店名称3] .... [数量]
值:
[产品1] [2.66] [2.94] [1.98] ..... [可编辑文本框]

我已经使用DataTable完成此工作,根据商店的数量,产品名称数量动态创建列。
没关系

是否有一种方法可以完成此操作,而不用使用DataTable? 是否可以动态创建一个列表,该列表将对商店的数量进行计数,并以水平方式创建(可能是匿名的)命名对象的数量

我想要完成的事情是这样的:

只记得:公共枚举EnumMercado {Extra = 1,Dia = 8,家乐福= 9,BIG = 10,Pao = 11};

var a = getmyCotacoes();
如果将鼠标指向运行的响应中,我希望能够看到一个“事物列表”,每个事物都将显示为该列表(可能是匿名列表):
产品:“产品1”
附加:2.1
直径:2.15
家乐福:3.7
大:2.1
包:2.25
数量:0

今天我有那些商店,但这会增加,并且我不想每次添加商店时都更改方法

顺便说一句,对不起我的英语,我是巴西人。

在adv中thx

拉斐尔

解决方法

您对不希望使用DataTable的评论没有任何意义;可以将datatables / datarows子类化以创建自定义类,就像您对List的提议解决方案所做的那样,因此您可以获取datatable的所有功能以及自定义类中的所需功能。 Visual Studio甚至还具有用于创建自定义数据表和数据行的内置设备,以便可以构建强类型的数据访问层(通常用于db,但不必如此)

关于必须加入原始搜索结果的评论也没有道理;数据表不是您的数据库表,并且可以包含比数据库更少或更多的列。例如,您的选择可能是SELECT ID as ProductId,Nome,Preco FROM products WHERE Nome LIKE 'Jamon%',所以三列,而数据表中可能有ProductId,Quantidade,Preco,PrecoTotal列,所以5列,而PrecoTotal的表达式可能是"[Preco] * [Quantidade]",因此它会自动计算。查询不会检索数量列,因此用户将其填写。总计仅计算何时填写数量。

我认为,在涉及是否使用数据表的问题时,更多的是您没有完全正确地使用它们或无法完全理解它们的工作方式。我确定他们可以解决您的问题,但是我们只需要确定实际问题


您的实际问题似乎是“我如何拥有数量可变的商店”-如果将商店保留在枚举(MercadoEnum)中,这将非常困难,因为枚举已编译到程序中。要添加新商店,您必须发布新程序。相反,您的商店应该是数据库中的表,就像您的产品一样。您应该有另一个表将商店链接到产品,并且特定产品的价格将存储在该表中,因为即使每个商店都可能出售牛奶,但它们都以不同的价格出售。当您查询船舶和价格时,您实际上会获得相同产品的产品清单,以及一堆不同的价格,但关键是您将价格作为行退回-如果有5家商店出售产品你得到5行。如果有两家商店出售产品,您将获得两行返还。您说的是要将它们作为-我们通常将其称为数据透视,即将可变数量的行转换为可变数量的列。这样做时要小心,因为这并不总是明智的。列通常被认为是事物的属性,事物通常没有无限可变的属性数量- 对它们进行建模可能会使它们更难使用

在这种情况下仍然可行;您在每个商店都有一个价格栏,然后在数据库或代码中执行数据透视,也许是通过将带有我要作为键的产品的数据表,并在每次遇到您不知道的商店。您最终将在每种产品中以一行显示每个商店中的价格列。如果您有多种产品,那么如果不是每个商店都出售每种产品,那么您可能会有很多空白


请注意,当我说商店时,我的意思是“全国连锁商店”-我在该市场列表中认识到家乐福,它们有很多位置,甚至每个分店都出售不同的产品。也许甚至产品链接也应该在分支机构级别(镇上的建筑物)而不是在商店群组级别进行,以允许不同的位置以不同的价格库存不同的产品


您的第一个问题不是“数据表做不到”,而是数据建模。您还没有完全适合您的程序的数据建模