首页 > 解决方案 > 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 是一个实体类(SQL 中的产品 ID 和 SQL 中的产品名称)
Cotacoes 是 Produto 列表(对于该产品链接的每个商店)

要获得完整的产品 x 价格,我有一份 PesquisaGeral 清单

现在问题开始了

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

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

我已经使用 DataTable 完成了这项工作,根据商店的数量以及产品名称和数量动态创建列。
没关系”

无论使用 DataTable,有没有办法做到这一点?是否可以动态创建一个列表来计算商店的数量并以水平方式创建命名对象的数量(可能是匿名的)?

我想要完成的是这样的:

记住:public enum EnumMercado { Extra = 1, Dia = 8, Carrefour = 9, BIG = 10, Pao = 11 };

var a = getmyCotacoes();
如果我将鼠标指向正在运行的响应,我希望能够看到每个事物将显示为的“事物列表”(可能是匿名列表):
Produt:"Product 1"
Extra:2.1
Dia:2.15
Carrefour :3.7
BIG:2.1
Pao:2.25
数量:0

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

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

thx in adv

拉斐尔

标签: c#datagridviewwindows-forms-designer

解决方案


您关于不想使用 DataTable 的评论没有意义;可以对数据表/数据行进行子类化以创建自定义类,就像您使用建议的 List 解决方案一样,因此您可以获得数据表的所有功能以及您想要从自定义类中获得的任何功能。Visual Studio 甚至有一个用于创建自定义数据表和数据行的内置设备,以便可以构建强类型数据访问层(通常用于 db,但不是必须的)

关于必须加入原始搜索结果的评论也没有意义;数据表不是您的数据库表,它可以包含比您的数据库更少或更多的列。例如,您的选择可能是SELECT ID as ProductId, Nome, Preco FROM products WHERE Nome LIKE 'Jamon%'三列,您的数据表可能有ProductId, Nome, Quantidade, Preco, PrecoTotal五列,PrecoTotal 可能有一个表达式,"[Preco] * [Quantidade]"因此它会自动计算。数量列不是查询得到的,所以用户填写。总数只在数量填写时计算。

我认为当涉及到是否使用数据表的问题时,更多的是你没有正确使用它们或完全理解它们是如何工作的;我确定他们可以解决您的问题,但我们只需要确定实际问题


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

在这种情况下,它仍然是可能的;您在每家商店都有一个价格列,并且您可以在数据库或代码中执行数据透视,可能通过使用我想要的产品作为键的数据表,并在每次遇到时添加一个新列你不知道的店。您最终会得到每个产品一行,每个商店都有一列价格。如果您有多种产品,那么如果不是每个商店都销售每种产品,那么您可能会有很多空白


请注意,当我说商店时,我的意思是“全国连锁商店”——我在 mercado 列表中认出了家乐福,他们有很多地点,甚至每个分店都可能以不同的方式销售一些产品。也许甚至产品链接也应该在分支机构级别(城镇中的建筑物)而不是商店组级别完成,以允许不同的位置以不同的价格存储不同的产品


您的第一个问题不是“数据表不能做”,而是数据建模问题;你还没有为你的程序建立合适的数据建模


推荐阅读