Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじめに

前回は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が配置されます。
サブフォルダに配置する方法もありますが説明を割愛しています。

longlongago_k
コピペですぐ動かせるレベルのtipsをまとめる
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした