ロジックコードを記述する

ロジックコードを記述する

次に処理を記述します。

ソリューションエクスプローラ内のMainPage.xamlを展開し、MainPage.xaml.vbをダブルクリックしてコード画面を開きます。

リスト4のようにロジックコードを記述します。

リスト4: ロジックコード(MainPage.xaml.vb)

LINQ to XMLでXMLを処理するクラスの含まれる、System.Xml.Linq名前空間をインポートします。印刷の機能を提供するクラスの含まれるSystem.Windows.Printing名前空間をインポートします。

personalInfoクラス内に、「氏名、年齢、住所、勤務先」のプロパティを定義します。

VS 2008では、単にフィールドに値を保存したり、取得したりするにも、Get/Setコードを記述する必要があり、コード自体が冗長になっていました。しかし、VS 2010では、VB 2010の自動実装プロパティを使用することができ、personalInfoクラスを以下のコードだけを使用して実装できるようになりました。

personalInfoクラスのリストとして作成するmyPersonalInfoをメンバ変数として宣言します。

■ページが読み込まれたときの処理

XElement.LoadメソッドでXML文書ファイルを読み込みます。<情報>要素のコレクションを取得するクエリ(query)を定義します。

queryを実行します。クエリコレクション内を反復処理しながら、Addメソッドで、personalInfoクラスの各プロパティ(「氏名、年齢、住所、勤務先」)に、XMLの各要素(<氏名>、<年齢>、<住所>、<勤務先>)の値を追加します。

DataGridコントロール(名前はDataGrid1)のItemsSourceプロパティに、myPersonalInfoオブジェクトを指定します。これで、DataGrid内にXMLデータが表示されます。

■[印刷]ボタンがクリックされた時の処理

新しいPrintDocumentのインスタンスmyPrintオブジェクトを生成します。PrintDocumentクラスはSilverlightアプリケーションの印刷機能を提供するクラスです。

ページの印刷中に発生するPrintPageイベントで、DataGrid_Printプロシージャを実行します。印刷が完了したときに発生する、EndPrintイベントでは、DataGrid_EndPrintプロシージャを実行します。

Printメソッドで印刷キューに指定するドキュメントの名前を指定して、印刷を開始します。

■DataGrid内のデータを複数ページに渡って印刷する処理

新しいWrapPanelのインスタンスmyWrapPanelオブジェクトを生成します。

加算されるメンバ変数pageNumberが、PersonalInfoクラスのリストであるmyPersonalInfoオブジェクトに追加されたデータの個数より小さい間、Whileステートメントで以下の処理を繰り返します。

新しい、SilverlightControl1(Silverlight ユーザーコントロール)のインスタンスmySilverlightControl1オブジェクトを生成し、DataContextプロパティにPersonalInfoクラスのリストとして作成した、myPersonalInfoオブジェクトを指定します。添え字に、加算されるpageNumberを指定します。WrapPanelコントロールにDataContextの設定された、mySilverlightControl1オブジェクトを追加します。

WrapPanelに対して、SizeにWidthとHeightを指定して、Measureメソッドを呼び出します。Widthには印刷可能なWidth(e.PrintableArea.Width)を指定し、Heightには正の無限大を表すDouble.PositiveInfinityを指定します。

Measureメソッドは、レイアウト処理の測定パスの実行中に、UIElementが計算したサイズを更新します。

WrapPanelのDesiredSize.Heightが、印刷可能なHeight(e.PrintableArea.Height)より大きく、かつ、WrapPanelコントロールに追加されたmySilverlightControl1オブジェクトの個数が1より大きかった場合は、WrapPanelコントロールから、RemoveメソッドでmySilverlightControl1オブジェクトを削除し、HasMorePagesプロパティにTrueを指定して、まだ印刷するページがあることを明示します。次にWhileステートメントから抜けます。

HasMorePagesプロパティにTrueを指定すると、印刷するページがある限り、PrintPageイベントでDataGrid_Printプロシージャが呼び出されます。DataGrid_Printが呼び出され、新しいWrapPanelオブジェクトが生成されmySilverlightControl1オブジェクトが追加される前に、すでにmySilverlightControl1オブジェクトが追加されている場合は、一度RemoveメソッドでmySilverlightControl1オブジェクトを削除しておきます。この処理をしなければ、ごみが入る場合があります(図9)。PersonalInfoクラスのリストとして作成したmyPersonalInfoオブジェクトの添え字に指定した、pageNumber変数を加算します。印刷する要素を指定するPageVisualプロパティに、WrapPanelのオブジェクトであるmyWrapPanelを指定します。これで、DataGridコントロールに表示されていたデータの一覧が、Silverlightユーザーコントロール(SilverlightControl1.xaml)で定義した形式で、印刷、または書き出されます。

■印刷が完了したときの処理

「完了」というメッセージを表示します。

この「完了」というメッセージが表示されない限り、XPSファイルは書き出されませんので、注意してください。

図9: XPSファイルに書き出した際、先頭にごみが入っている

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30