【问题标题】:C# Winforms Listbox filtering Datagridview by DateC# Winforms Listbox 按日期过滤 Datagridview
【发布时间】:2021-02-23 17:08:37
【问题描述】:

所以,我有一个带有“结算日期”列的 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中,就像它是一个字符串一样排序?

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

干杯

【问题讨论】:

    标签: c# date datagridview listbox format


    【解决方案1】:

    问题可能是 SQL 数据阅读器将您的日期列解释为字符串而不是日期,因为 Excel 电子表格没有任何类型的固有架构,因此 SQL 数据阅读器会查看特定数据中前几行中的值列尝试推断数据类型。尝试从

    更改填充列表框的逻辑
    {
    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 值,但您用于选择过滤值的列​​表框包含一个字符串值(如果您使用上面的代码,这将是)。您没有包含引发错误的代码,因此这只是一个假设。当您将过滤值应用于 gridview 时,请务必将过滤值转换为正确的数据类型 - 不要依赖隐式转换来为您完成。

    【讨论】:

      【解决方案2】:

      感谢@Dave Holden,我了解到我的 SQL SERVER 有英文日期,而我的 Windows 应用程序(Excel、C# winform)以法语/UE 格式显示日期。我需要使用的代码,以便我可以在我的列表框和 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}',";
          }
                           
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-23
        • 2016-04-11
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        相关资源
        最近更新 更多