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
相关产品推荐
相关产品推荐

