C#Winforms列表框按日期筛选Datagridview

C#Winforms列表框按日期筛选Datagridview,c#,date,datagridview,listbox,format,C#,Date,Datagridview,Listbox,Format,因此,我有一个excel文件,列为“结算日期”,格式为:dd/mm/yyyy。我通过“日期”格式的SQL列发送此内容,其中格式在yyyy-mm-dd中自动更改。然后,当我使用以下方式将此SQL列发送到C#Winforms列表框时: SqlCommand cmd = new SqlCommand(sqlStr, conn); SqlDataReader rd = cmd.ExecuteReader(); while (rd.Read()) { mylistbox.Items.Add(rd[0]);

因此,我有一个excel文件,列为“结算日期”,格式为:dd/mm/yyyy。我通过“日期”格式的SQL列发送此内容,其中格式在yyyy-mm-dd中自动更改。然后,当我使用以下方式将此SQL列发送到C#Winforms列表框时:

SqlCommand cmd = new SqlCommand(sqlStr, conn);
SqlDataReader rd = cmd.ExecuteReader();
while (rd.Read())
{
mylistbox.Items.Add(rd[0]);
}
日期以dd/mm/yyyy(与我在excel上使用的格式相同)再次显示,最后,当我尝试使用刚刚填充的列表框按结算日期筛选datagridview时,我收到以下错误消息:

"Conversion failed when converting date and/or time from character string".
到目前为止,我读了一些东西,但我在这里有点困惑,我应该直接将格式从开始(excel表)更改为SQL server,还是在SQL中从格式“date”更改为“string”,一旦在winform中,只按字符串排序

如果听起来不太清楚或者你需要更多信息,请告诉我


cheers

问题可能是SQL数据读取器将日期列解释为字符串而不是日期,因为Excel电子表格没有任何固有的模式,因此SQL数据读取器会查看特定列中前几行的值,以尝试推断数据类型。尝试更改填充列表框的逻辑

{
mylistbox.Items.Add(rd[0]);
}


错误消息表明,您尝试筛选的gridview列绑定到日期时间值,但用于选择筛选值的列表框包含字符串值(如果使用上面的代码,则为字符串值)。您没有包含抛出错误的代码,因此这只是一个假设。将筛选值应用于gridview时,请确保将筛选值转换为正确的数据类型-不要依赖隐式转换来完成此操作。

多亏了@Dave Holden,我了解到我的SQL SERVER有英文日期,而我的windows应用程序(Excel、C#winform)以法语/UE格式显示日期。我需要使用的代码,以便在我的listbox和datagridview中显示法语/UE格式,同时在sql server US格式中进行过滤:

C#
foreach (var li in lb.SelectedItems)
{
    DateTime dt;
    if (li.GetType() == typeof(DateTime))
    {
        if (DateTime.TryParse(li.ToString(), out dt))
        {
            strCondition += $"'{dt:yyyy-MM-dd}',";
        }
    }
    else
    {
        strCondition += $"'{li}',";
    }
                     
}
所以我实际上在每个列表框中循环,得到每个选定的项目。 我知道它可以是string或date/datetime,所以选择的项目是date/datetime,然后我将其转换为string(TryParse的第一个参数必须是string),最终以纯datetime格式输出,我将应用于SQL Server中的“yyyy-mm-dd”。 因此,我的用户可以用法语显示日期,但该应用程序“将连接到过滤美国日期的SQL”

C#
foreach (var li in lb.SelectedItems)
{
    DateTime dt;
    if (li.GetType() == typeof(DateTime))
    {
        if (DateTime.TryParse(li.ToString(), out dt))
        {
            strCondition += $"'{dt:yyyy-MM-dd}',";
        }
    }
    else
    {
        strCondition += $"'{li}',";
    }
                     
}