読者です 読者をやめる 読者になる 読者になる

No more Death March

あるSEのチラシの裏 C# WPF

文字列からプリンタを取得

using System;
using System.Printing;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var queueByFullName = new PrintQueue(new LocalPrintServer(), LocalPrintServer.GetDefaultPrintQueue().FullName);
            Console.WriteLine(queueByFullName.FullName);
            Console.ReadKey();
        }
    }
}
<||

PrintQueueクラスのコンストラクタにPrintServerクラスのインスタンスとプリンタの完全名(文字列)を渡すと取得出来る。


以下のようにインストールされていないプリンタ名を指定するとSystem.Printing.PrintQueueExceptionが発生する。
>|cs|
using System;
using System.Printing;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //var queueByFullName = new PrintQueue(new LocalPrintServer(), LocalPrintServer.GetDefaultPrintQueue().FullName);
            var queueByFullName = new PrintQueue(new LocalPrintServer(), "Hoge");
            Console.WriteLine(queueByFullName.FullName);
            Console.ReadKey();
        }
    }
}

インストールされているプリンターの一覧を取得する。

using System;
using System.Printing;

namespace LocalPrintersName
{
    class Program
    {
        static void Main(string[] args)
        {

            foreach(var queue in new LocalPrintServer().GetPrintQueues())
            {
                Console.WriteLine(queue.FullName);
            }
            Console.ReadLine();
        }
    }
}

LocalPrintServerのインスタンスメソッドGetPrintQueuesを実行
実行した端末のPrintQueueクラスのコレクションが返る。

後はPrintQueueクラスのプロパティを出力

既定のプリンター名を取得する。

using System;
using System.Printing;

namespace DefaultPrinterName
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("既定のプリンタは{0}です。", LocalPrintServer.GetDefaultPrintQueue().FullName);

            Console.ReadKey();
        }
    }
}

system.printingを参照設定に追加
LocalPrintServerクラスのstaticメソッドGetDefaultPrintQueueでプリンタ設定のインスタンスを取得
FullNameプロパティでプリンタ名を取得

WPFで帳票 参考リンク

ネットで色々検索してみるとWPFでも帳票印刷が出来るらしい。
後で参考に出来そうなリンクをメモ

以下参考:
WPFでの印刷の基本(1) 単一ページの印刷 - Qiita
WPFでの印刷の基本(2) 複数ページの印刷 - Qiita
WPFを帳票フレームワークとして使う - @kotyのブログ
WPF/XAMLで帳票のデザイン・印刷を行う - Qiita
[C#]プリンタ一覧と、デフォルトプリンタを取得するには
のぶろぐ WPFでの印刷

C# App.Configでエラー

DbProviderFactoriesの仕組みを勉強してて、DbProviderFactories.GetFactoryClasses()でConfigurationErrorExceptionが発生。

App.Configをよ~く見てみるとセクションの後のスペースが交っていた。
これを消してやると解消。

1時間くらい悩みました・・・

C# 月初日

public DateTime MonthFirstDate(DateTime value)
{
    return new DateTime(value.Year, value.Month, 1);
}

DateTimeのコンストラクタの日にち部分に1を渡す。

C# 月末日

public DateTime ToMonthLastDate(DateTime value)
{
    return new DateTime(value.Year, value.Month, DateTime.DaysInMonth(value.Year, value.Month));
}

年と月はそのまま、日にちだけDateTimeクラスのDaysInMonthメソッドに年と月を渡してやる。
VB6の時は翌月1日の前日という具合に算出していたけど、オーバーフローのチェックが必要になるのでこっちの方が良い。