0

DateTime 情報 (特定の日付より前または後) に基づいて DataGridView をフィルター処理できるようにしようとしていますが、フィルターを作成すると、すべての情報を読み取るため、文字列を DateTimes と比較できないと表示されます。 XMLファイルから文字列として入力する方法がわかりません。誰でも助けることができますか?

より詳細な説明:を使用して DataSet にプルする情報でいっぱいの 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' フィールドが文字列ではなく文字列として表されているSystem.DateTimeため、DateTime比較が失敗しています。

DateTime1 つの解決策は、XML の作成時にその特定のフィールドのデータ型を指定することです。

もう 1 つのオプションは、関数を使用するように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 に答える