繁体   English   中英

C# Winforms Listbox 按日期过滤 Datagridview

[英]C# Winforms Listbox filtering Datagridview by Date

所以,我有一个 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 服务器,或者可能在 SQL 中从格式“日期”更改为“字符串”并在 winform 中更改一次,只是排序,因为它会是一个字符串?

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

干杯

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

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

{
  DateTime dt;
  if (!rd[0] is DateTime) {    
    if (DateTime.TryParse(rd[0], out dt) {
        mylistbox.Items.Add(dt.ToString("yyyy-MM-dd"));
    }
  } else {
    mylistbox.Items.Add(rd[0].ToString("yyyy-MM-dd"));
  } 
}

错误消息表明您尝试过滤的 gridview 列绑定到 DateTime 值,但您使用的列表框 select 您的过滤值包含一个字符串值(如果您使用上面的代码,它将是)。 您没有包含引发错误的代码,因此这只是一个假设。 当您将过滤值应用于 gridview 时,请务必将过滤值转换为正确的数据类型 - 不要依赖隐式转换为您执行此操作。

感谢@Dave Holden,我了解到我的 SQL SERVER 的日期为英文,而我的 windows 应用程序(Excel、C# winform/UE)以法语格式显示日期。 我需要使用的代码,以便在 sql 服务器美国格式中过滤时,我可以在列表框和 datagridview 中显示法语/UE 格式:

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}',";
    }
                     
}

所以我实际上在每个列表框中循环,我得到每个选定的项目。 我知道它可以是字符串或日期/日期时间,所以选择的项目是日期/日期时间然后我把它变成字符串(TryParse 的第一个参数必须是一个字符串)最终在纯日期时间中有 output 我将应用于它是在 SQL 服务器中工作的“yyyy-mm-dd”。 因此,我的用户的日期以法语显示,但应用程序将连接到 SQL 过滤美国日期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM