绑定数据网格列文本格式未更改



我使用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绑定到该对象集合。

最新更新