如何根据 c# winforms 中的列日期和名称将 sql 中的数据输入到特定的 datagridview 单元格中

Posted

技术标签:

【中文标题】如何根据 c# winforms 中的列日期和名称将 sql 中的数据输入到特定的 datagridview 单元格中【英文标题】:How do you input data from sql into a specific datagridview cell based on column date and name in c# winforms 【发布时间】:2021-03-14 13:44:33 【问题描述】:

我的数据库中有一个存储数据条目的表。有一个姓名列,每个人的姓名在他们扫描序列号时插入,3 个中间列用于序列输入,最后一列是日期。 数据库样本:

我有一个带有 datagridview 的 winform,它会在每个月的每一天填充列标题中的日期。我想弄清楚的是如何根据datagridview中的日期填充不同的名称以及它们的序列号计数。我可以填充名称,但特定日期的连续计数让我很着迷。 这是我的winform的样子:

和代码:

DateTime dt = DateTime.Now;
                var startDate = new DateTime(dt.Year, dt.Month, 1);
                int days = DateTime.DaysInMonth(dt.Year, dt.Month);
                for (int i = 0; i < days; i++)
                
                    dataGridView1.Columns.Add("clm_" + startDate.ToShortDateString(), startDate.ToString("dd-MMM"));
                    startDate = startDate.AddDays(1);
                
                using (SqlConnection sqlConnection = new SqlConnection(@"connection"))
                
                    SqlCommand sqlCmd = new SqlCommand("SELECT DISTINCT NAME FROM repair_data_entry", sqlConnection);
                    sqlConnection.Open();
                    SqlDataReader sqlReaderName = sqlCmd.ExecuteReader();
                    while (sqlReaderName.Read())
                    
                        dataGridView1.Rows.Add(sqlReaderName["NAME"].ToString());
                    
                    sqlReaderName.Close();
                    
                

我需要做的是提取每个技术每天的序列数。就像比尔贝瑞斯特定日期的序列计数显示在该特定单元格中。这可能是我需要以不同方式设置数据库的事情,我不知道。这不会是一个问题。我应该注意也没有具体的名字。每天都会有 20-30 个名字在变化,所以我的意图是动态的。

编辑:

我一直在摆弄 SQL fiddler,我发现查询有效!但是,我不得不硬编码日期。由于技术人员每天都会输入数据,我如何根据 CREATED 列中的内容使它们动态化?

这是查询:

SELECT NAME AS TECH,   
[12/1/2020], [12/2/2020]  
FROM  
(SELECT NAME, REP, CREATED  
    FROM repair_data_entry) AS SourceTable  
PIVOT  
(  
COUNT(REP)  
FOR CREATED IN ([12/1/2020], [12/2/2020])  
) AS PivotTable;

http://sqlfiddle.com/#!18/8bc96/1

【问题讨论】:

我相信您会希望在对数据库的查询中执行此操作。目前尚不清楚您在每个单元格中想要什么值。 “Repair”、“BGA”和“Ber”值在哪里?示例……您希望单元格“01-Dec”的 Bill Berry 行中的内容是什么? 我认为你是对的。所以,在数据库中,序列号被存储。我只需要数一数。我对此有疑问。这是我用于主管检索数据并导出到 csv 的查询:"SELECT NAME AS TECH, COUNT(NULLIF(REPAIR,'')) AS REPAIR, COUNT(NULLIF(BGA,'')) AS BGA, COUNT(NULLIF(BER,'')) AS BER, DATE FROM repair_data_entry WHERE DATE BETWEEN '" + dtpStart.Value + "' AND '" + dtpEnd.Value + "' AND NAME = '" + cbTech.Text + "' GROUP BY NAME, DATE"; 我只需要在单元格“01-DEC”中计数比尔贝瑞,无论他那天输入了多少连续剧 很难说查询是否有效,我假设它会,我不擅长构建复杂的查询。我的观点是,如果您使用查询 AND 从数据库中获取数据,然后,格式化网格 AND 数据以以不同的方式显示它……那么您做错了。然后,您希望以应显示的方式(如果可能)从数据库中获取数据,并且出于美观原因仅“格式化”。这可能很复杂,但是与添加列、计算序列号等相比,构建查询以返回您想要的表会是一种更好的方法。 我明白了。我发布的查询非常有效。我只是不知道如何操纵这一切,所以它显示了我想要的方式。不过值得一试。这就是该查询产生的结果:query output。这对一件事很好。我只是想稍微操作一下,并在旁边显示名称和列标题中的每个日期。如果当天没有输入序列号,则显示“0”。使用谷歌表格超级容易哈哈,这是我目前使用的,但维护起来太麻烦了。 尝试使用最后一张图片,应该不难,我只能在开始之前建议您“创建”一个包含所需列的新表。不要使用网格“直接”重建它,重建为“新”表,然后将新表用作网格的数据源。 【参考方案1】:

我想通了 sql 查询:

    DECLARE @Date AS VARCHAR(MAX),
        @query AS VARCHAR(MAX)
        
select @dATE = STUFF((SELECT ',' + QUOTENAME(REPLACE(CONVERT(VARCHAR(10), CREATED, 101), '-', '/')) 
                    from repair_data_entry
                    group by CREATED
                    ORDER BY CREATED
            FOR XML PATH(''), TYPE
            ).value('.', 'VARCHAR(MAX)') 
        ,1,1,'')

SET @query = 'SELECT NAME AS TECH, ' + @Date + ' 
  
FROM  
(SELECT NAME, CREATED, REP  
    FROM repair_data_entry) AS S  
PIVOT  
(  
COUNT(REP)  
FOR CREATED IN ('+@Date+')  
) P'
EXECUTE(@query)

这正是我想要的。所以这就回答了这个问题。 sqlFiddle

谁能指出将日期样式更改为“MM / dd / yyyy”的方向?

编辑:找到答案。更新查询

【讨论】:

以上是关于如何根据 c# winforms 中的列日期和名称将 sql 中的数据输入到特定的 datagridview 单元格中的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 中datagridview ,如何实现点击列头,对应的列自动排序。

关于c# winform datagrid的列宽如何设置为自动适应内容宽度? 在网上找到的这段代码

根据上次日期选择记录

Winforms C#:从远程计算机文件夹获取图像并加载到 DataTable 的列中

C#的winform中怎么根据函数找到对应的控件?

C# winform 日历控件的日期显示格式