我使用SQLite的DB浏览器创建了一个数据库表,其中每列的类型都是text
。现在,所述表中有一列的字符串格式为yyyy-MM-dd,但当我想在数据网格中查看该列的数据时,我希望它以dd-MM-yyyy-的格式显示。
首先我试了一下
<DataGrid x:Name="dataGrid1" Width="800" Height="400" AutoGenerateColumns="False">
<DataGrid.Columns>
...
<DataGridTextColumn Header="DueDate" Width="100" Binding="{Binding DueDate, StringFormat='dd-MM-yyyy'}"></DataGridTextColumn>
...
</DataGrid.Columns>
</DataGrid>
但它没有起作用。
然后我在我的代码绑定中添加了以下代码
[ValueConversion(typeof(DateTime), typeof(String))]
public class DateTimeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return DateTime.ParseExact(value.ToString(), "dd-MM-yyyy", CultureInfo.InvariantCulture);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后将以下代码添加到XAML
xmlns:local="clr-namespace:SQLiteTest"
....
<Window.Resources>
<local:DateTimeConverter x:Key="converter"/>
</Window.Resources>
...
<DataGridTextColumn Header="DueDate" Width="100" Binding="{Binding DueDate,Converter={ StaticResource converter}, StringFormat=dd-MM-yyyy}"></DataGridTextColumn>
但是当我运行代码时,我得到错误
System.FormatException:字符串未被识别为有效的DateTime。
在线return DateTime.ParseExact(value.ToString(), "dd-MM-yyyy", CultureInfo.InvariantCulture);
上
有人能帮我吗?
编辑:
我正在像这样的按钮点击事件中进行过滤器查询
using(SQLiteConnection conn= new SQLiteConnection(@"Data Source=TestDB.db;"))
{
conn.Open();
SQLiteCommand command = new SQLiteCommand("SELECT * FROM billdata WHERE DueDt >= date('now','-1 days') AND DueDt < date('now','+10 days') AND PaidOn = '' ORDER BY DueDt", conn);
command.ExecuteNonQuery();
SQLiteDataAdapter adap = new SQLiteDataAdapter(command);
DataTable dt = new DataTable("SrcData");
adap.Fill(dt);
dataGrid1.ItemsSource=dt.DefaultView;
conn.Close();
}
第一次尝试的问题是数据不是DateTime,因此无法转换。
对于值转换器,问题在于转换器期望一个格式为"0"的字符串;dd-MM-yyyy";,而不是数据库中日期的格式。如果数据库格式为yyyy-MM-dd,只需使用常规的DateTime解析函数,而不用ParseExact和特定格式。
if (DateTime.TryParse(value.ToString(), out var dt))
{
return dt;
}
else
{
return string.Empty; //return whatever you want to indicate that the data was bad
}
我更喜欢使用DateTime.TryParse,因为如果解析失败,它不会引发异常。然后,您可以返回任何对您的UI有意义的内容。
顺便说一句,如果你知道一列是日期时间,那么在读入值时将其转换为日期时间,而不是用原始文本格式打乱表。在转换器中解析到日期时间,然后格式化输出有点低效。您可以将数据表中的每一行转换为一个有代表性的对象(包括解析日期时间(,然后将DataGrid绑定到该对象集合。