如何根据 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的列宽如何设置为自动适应内容宽度? 在网上找到的这段代码