はじめに
前回はPropertyGridのアイテムをテキストでコピーしました。
今回はLINQPadと連携してhtmlビューを作成したいと思います。
第1回はこちら http://qiita.com/longlongago_k/items/70969b2af04af58ae70d
大まかな実装の流れは下記のとおりです。所要時間は15分です。
- 簡易HTMLビューアを作成
- LINQPadを使用したhtml出力コマンドの作成
簡易HTMLビューアの作成
出力したHTMLは保存してもよいのですが、パパッと値を見るためには内臓のhtmlビューアに表示したほうが便利です。
WebBrowserコントロールを張り付けるだけの簡単なhtmlビューアを作ってみましょう。
まず、前回のプロジェクトに新しいフォームHTMLView.cs追加します。フォームにWebBrowser、SaveFileDialog、保存ボタンを追加します。
コードは下記のとおりです。コンストラクタで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です。
次に、コンテクストメニューに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");
}
}
コードの内容は大体以下のような感じです。
- LINQPad.Util.ToHtmlString()でHTMLソースの取得
- htmlViewにhtmlソースを渡してFormをShowする。
ここで、気を付けないといけないのは、PropertyGridのカテゴリ名も選択できてしまうということです。
カテゴリを選択したときは、子要素を以下のように取得する必要があります。Cast関数はLINQのSelectを呼び出すのに必要な処理です。forで書く場合はたぶん必要ありません。
val = SelectedGridItem.GridItems.Cast<GridItem>().Select(x => new { x.Label, x.Value });
非常に簡単ですが、以上です。シンプルで便利なのでぜひ試してみてください。
ここまでのプロジェクトを以下に置いておきます。 右クリックから保存してjpg→zipにリネームしてください。
追記
今回の方法だと、自作アプリのexeと同じ場所にLINQPad.exeが配置されます。
サブフォルダに配置する方法もありますが説明を割愛しています。