0

我试图能够根据 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,所以如果需要,我可以修改语法以使其工作,我只是不知道如何。

请和谢谢!- 基思

4

1 回答 1

1

您已经确定了问题:您的 XML 文件中的“PublishingExpirationDate”字段被表示为字符串而不是 a System.DateTime,因此您的DateTime比较失败了。

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

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

您似乎RowFilter排除了过去日期为“PublishingExpirationDate”的记录。在这种情况下,您可以将比较日期替换DateTime.Min为具有空“PublishingExpirationDate”字段值的记录。

这是您的过滤器的外观:

var filter = string.Format("CONVERT(IIF(LEN(PublishingExpirationDate) = 0,'{0}',PublishingExpirationDate),'System.DateTime') > #{1}#", DateTime.MinValue.ToString(), DateTime.Today.ToString());
myDataView.RowFilter = filter;
于 2012-10-11T04:39:19.740 回答