You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 从DataTable取日期填充DateTimePicker报FormatException如何解决

问题原因分析

  • 两个场景的数据源特性存在差异:你之前DataGridView绑定的数据源对应日期列大概率是DateTime类型,ToString输出的格式刚好匹配当前系统默认区域的日期格式,所以转换可以成功;当前从DataRow读取的第31/32列数据存在以下可能的异常场景:
    • 字段值为DBNull,ToString之后得到空字符串,无法转换为日期
    • 字段存储的是字符串格式的日期,格式不符合当前线程默认的日期解析规则
    • 明明字段本身是DateTime类型,多余调用ToString反而引入了格式转换风险

解决方案

最优方案(字段为DateTime类型时使用)

如果数据表对应列本身就是日期类型,不需要做字符串转换,直接判断非空后强转即可,完全规避格式问题:

private void CmbSitePSI3_SelectedIndexChanged(object sender, EventArgs e)
{
    DataRowView rv1 = cmbSitePSI3.SelectedItem as DataRowView;
    if (rv1 != null)
    {
        // 处理dateTimePicker1赋值
        if (rv1.Row[31] != DBNull.Value)
        {
            dateTimePicker1.Value = (DateTime)rv1.Row[31];
        }
        else
        {
            // 空值时可自定义默认值
            dateTimePicker1.Value = DateTime.Now;
        }
        // 处理dateTimePicker2赋值逻辑同上
        if (rv1.Row[32] != DBNull.Value)
        {
            dateTimePicker2.Value = (DateTime)rv1.Row[32];
        }
        else
        {
            dateTimePicker2.Value = DateTime.Now;
        }
        cmbDayNight.Text = rv1[35].ToString();
        txtCombined.Text = rv1[36].ToString();
        cmbSiteType.Text = rv1[37].ToString();
    }
    else
    {
        ClearSite();
    }
}

兼容方案(字段为字符串类型存储日期时使用)

如果确认字段是用字符串存储日期,先指定实际的日期格式做安全转换,避免抛出异常:

using System.Globalization;

private void CmbSitePSI3_SelectedIndexChanged(object sender, EventArgs e)
{
    DataRowView rv1 = cmbSitePSI3.SelectedItem as DataRowView;
    if (rv1 != null)
    {
        string dateStr1 = rv1.Row[31]?.ToString().Trim();
        if (!string.IsNullOrEmpty(dateStr1))
        {
            // 第二个参数替换为你实际的日期格式,例如"yyyy/MM/dd" "MM-dd-yyyy"等,也可传入格式数组匹配多种格式
            if (DateTime.TryParseExact(dateStr1, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime dt1))
            {
                dateTimePicker1.Value = dt1;
            }
            else
            {
                dateTimePicker1.Value = DateTime.Now;
            }
        }
        else
        {
            dateTimePicker1.Value = DateTime.Now;
        }
        // dateTimePicker2的转换逻辑同上
        cmbDayNight.Text = rv1[35].ToString();
        txtCombined.Text = rv1[36].ToString();
        cmbSiteType.Text = rv1[37].ToString();
    }
    else
    {
        ClearSite();
    }
}

内容的提问来源于stack exchange,提问作者Anthony Mullins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 03:27:02