WinForms DataGridView 从 XML 读取 - 无法按日期进行筛选,因为它没有意识到属性是日期时间?



我试图能够根据DateTime信息(早于或大于某个日期)过滤DataGridView,但当我创建过滤器时,它说它不能将字符串与DateTimes进行比较,因为它以字符串的形式读取XML文件中的所有信息,而我不知道如何键入它们有人能帮忙吗

更详细的解释:我有一个XML文件,里面装满了用myDataSet.ReadXML()拉入数据集中的信息。我在前面的步骤中自己创建了XML。这是一个示例:

<site>
<subsite URL="http://website/home">
<pages />
<subsite URL="http://website/home/de-de">
<pages>
<page name="default_ex.xml" URL="http://www.my-website.com/home/de-de/default_ex.aspx" CreatedOn="8/23/2012 3:13:47 PM" CreatedBy="Joe Schmoe" LastModifiedOn="8/23/2012 3:17:44 PM" LastModifiedBy="Joe Schmoe" Version="1.0" PublishingStartDate="" PublishingExpirationDate="" ApprovalState="APPROVED" FileSize="1120" CheckedOutUser="" DaysSinceCreated="46" DaysSinceLastModified="46" IsPublicFacing="False"/>
</pages>
</subsite>
<subsite URL="http://website/home/en-us">
<pages>
<page name="default_ex.xml" URL="http://www.my-website.com/home/en-us/default_ex.aspx" CreatedOn="8/23/2012 10:40:53 AM" CreatedBy="Joe Schmoe" LastModifiedOn="8/23/2012 2:55:15 PM" LastModifiedBy="Joe Schmoe" Version="2.0" PublishingStartDate="" PublishingExpirationDate="" ApprovalState="APPROVED" FileSize="1122" CheckedOutUser="" DaysSinceCreated="46" DaysSinceLastModified="46" IsPublicFacing="False"/>
</pages>
</subsite>
<subsite URL="http://website/home/fr-fr">
<pages>
<page name="default_ex.xml" URL="http://www.my-website.com/home/fr-fr/default_ex.aspx" CreatedOn="8/2012 1:12:30 PM" CreatedBy="Boring Guy" LastModifiedOn="8/23/2012 11:59:41 AM" LastModifiedBy="Joe Schmoe" Version="1.1" PublishingStartDate="" PublishingExpirationDate="" ApprovalState="PENDING" FileSize="955" CheckedOutUser="" DaysSinceCreated="47" DaysSinceLastModified="46" IsPublicFacing="False"/>
</pages>
</subsite>
<subsite URL="http://website/home/ja-jp">
<pages>
<page name="default_ex.xml" URL="http://www.my-website.com/home/ja-jp/default_ex.aspx" CreatedOn="8/23/2012 3:50:29 PM" CreatedBy="Mary Poppins" LastModifiedOn="8/23/2012 3:58:28 PM" LastModifiedBy="Mary Poppins" Version="1.0" PublishingStartDate="" PublishingExpirationDate="" ApprovalState="APPROVED" FileSize="1199" CheckedOutUser="" DaysSinceCreated="46" DaysSinceLastModified="46" IsPublicFacing="False"/>
</pages>
</subsite>
</subsite>

然后将其加载到DataGridView中,如下所示…:

myDataSet.ReadXml(@"MyData.xml");
myDataView = new DataView(myDataSet.Tables["Page"]);
myDataGridView.DataSource = myDataView;

到目前为止效果很好。我甚至可以很容易地过滤它,但当我试图根据不应该是字符串的属性(比如"LastModifiedOn")进行一些过滤时,就像这样…:

myDataView.RowFilter = "PublishingExpirationDate > #" + DateTime.Now.Date.ToString() + "#";

我得到了一个错误,因为就DataView(或DataGridView,我不确定)而言,"PublishingExpirationDate"是字符串如何才能基于非字符串列进行筛选

注意:我对XML有点陌生,在前面的一步中,我自己在这个项目中创建了XML,所以如果需要修改语法,我可以修改语法,但我不知道如何修改

求你了,谢谢!-Keith

您已经发现了问题:XML文件中的"PublishingExpirationDate"字段表示为字符串,而不是System.DateTime,因此DateTime比较失败。

一种解决方案是在创建XML时将该特定字段的数据类型指定为DateTime

另一个选项是将DataColumn.Expression属性设置为使用Convert函数。但是,如果您尝试此操作,您会发现它在"PublishingExpirationDate"字段中具有空值的记录上失败。要绕过此问题,请使用IIf函数来确定该字段对于给定记录是否为空,以及是否替换任意DateTime值,以从比较中获得所需的结果。

您的RowFilter似乎正在排除过去具有"PublishingExpirationDate"日期的记录。在这种情况下,对于"PublishingExpirationDate"字段值为空的记录,可以用DateTime.Min代替比较日期。

以下是您的过滤器可能的样子:

var filter = string.Format("CONVERT(IIF(LEN(PublishingExpirationDate) = 0,'{0}',PublishingExpirationDate),'System.DateTime') > #{1}#", DateTime.MinValue.ToString(), DateTime.Today.ToString());
myDataView.RowFilter = filter;

相关内容

最新更新