LoginSignup
4
6

More than 5 years have passed since last update.

PropertyGridにコピペ機能を追加する(2/2) - LINQPad連携

Last updated at Posted at 2016-07-18

はじめに

前回はPropertyGridのアイテムをテキストでコピーしました。
今回はLINQPadと連携してhtmlビューを作成したいと思います。
第1回はこちら http://qiita.com/longlongago_k/items/70969b2af04af58ae70d
Figure5.png

大まかな実装の流れは下記のとおりです。所要時間は15分です。
1. 簡易HTMLビューアを作成
2. LINQPadを使用したhtml出力コマンドの作成

簡易HTMLビューアの作成

出力したHTMLは保存してもよいのですが、パパッと値を見るためには内臓のhtmlビューアに表示したほうが便利です。
WebBrowserコントロールを張り付けるだけの簡単なhtmlビューアを作ってみましょう。

まず、前回のプロジェクトに新しいフォームHTMLView.cs追加します。フォームにWebBrowser、SaveFileDialog、保存ボタンを追加します。
Figure6.png

コードは下記のとおりです。コンストラクタでhtmlソースを渡して表示できるようにしたのと、htmlファイルの保存機能を追加しただけです。

  public partial class HtmlView : Form
  {
    public HtmlView()
    {
      InitializeComponent();
    }

    public HtmlView(string htmlSourceText) : this()
    {
      SetSourceHtml(htmlSourceText);
    }

    public void SetSourceHtml(string htmlSourceText)
    {
      webBrowser.DocumentText = htmlSourceText;
    }

    private void buttonSaveAs_Click(object sender, EventArgs e)
    {
      try
      {
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
          using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, Encoding.UTF8))
            sw.Write(webBrowser.DocumentText);
        }
      }
      catch (Exception ex)
      {
        MessageBox.Show(ex.ToString(), "error");
      }

    }
  }

LINQPad連携HTML出力

LINQPadとは、通常単独で使用する便利ツールなのですが、アセンブリとしてプログラムに直接組み込むことでLINQPadの便利機能を使用することができます。

まずは、プロジェクトにLINQPadフォルダを作成し、LINQPad.exeをコピーします。
次に、参照の追加→コピーしてきたLINQPad.exeを選択します。(※)

※ わざわざLINQPadをプロジェクトにコピーせずとも、インストールしたLINQPad.exeを直接参照してもOKです。
Figure7.png

次に、コンテクストメニューにHTML出力のメニューを作成し、Clickイベントに下記コードを追加します。

    private void ToolStripMenuItemCopyToHtml_Click(object sender, EventArgs e)
    {
      try
      {
        object val;
        if (SelectedGridItem.GridItemType == GridItemType.Category)
        {
          val = SelectedGridItem.GridItems.Cast<GridItem>().Select(x => new { x.Label, x.Value });
        }
        else
        {
          val = SelectedGridItem.Value;
        }
        string text = LINQPad.Util.ToHtmlString(true, 10, val);
        Clipboard.SetText(text);
        HtmlView hv = new HtmlView();
        hv.SetSourceHtml(text);
        hv.Show();
      }
      catch (System.IO.FileNotFoundException ex)
      {
        MessageBox.Show("LINQPad.exeが見つかりませんでした。\r\n" + ex.ToString(), "error");
      }
    }

コードの内容は大体以下のような感じです。
1. LINQPad.Util.ToHtmlString()でHTMLソースの取得
2. htmlViewにhtmlソースを渡してFormをShowする。

ここで、気を付けないといけないのは、PropertyGridのカテゴリ名も選択できてしまうということです。
カテゴリを選択したときは、子要素を以下のように取得する必要があります。Cast関数はLINQのSelectを呼び出すのに必要な処理です。forで書く場合はたぶん必要ありません。

val = SelectedGridItem.GridItems.Cast<GridItem>().Select(x => new { x.Label, x.Value });

非常に簡単ですが、以上です。シンプルで便利なのでぜひ試してみてください。
ここまでのプロジェクトを以下に置いておきます。 右クリックから保存してjpg→zipにリネームしてください。
PropertyGridPlus_html.zip.jpg

追記
今回の方法だと、自作アプリのexeと同じ場所にLINQPad.exeが配置されます。
サブフォルダに配置する方法もありますが説明を割愛しています。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6