2010年08月29日

ToolTipで改行

   このエントリーをはてなブックマークに追加 Clip to Evernote
久しぶりに ToolTipコントロールを使ったら、改行の方法が分からない。 multilineプロパティなんて無いし...

とおもったら、なんのことは無い、改行コードを入れれば良いだけだった.

以下、checkBox1にツールチップの表示を設定するC#のコード

この手のコードを書くと、\n だけで改行してくれればいいのにといつも思う。
もちろん、そのために Environment.NewLine があるのは分かっているけど...
  

Posted by gushwell at 23:09Comments(0)TrackBack(0)

2010年02月03日

NotifyIconの左クリックでコンテキストメニューを表示させる

   このエントリーをはてなブックマークに追加 Clip to Evernote
System.Windows.Forms.NotifyIcon クラスを使うと、通常、右クリックでコンテキストメニューが表示されます。
これを右クリックではなく、左クリックでコンテキストメニューを表示させるサンプルコードです。


privateメソッドを呼ぶという、かなり強引でトリッキーなやり方ですが、うまく動いています。

デザイン時には、notifyIcon1.ContextMenuStrip プロパティには、何も設定しません。
このやり方の場合、メニューが表示されているときに、デスクトップ領域をクリックすると、メニューが消えてくれます。
contextMenuStrip1.Show() だと、メニュー項目を選ぶまで消えてくれません。

それと、Clickではなく、MouseUpイベントで行うのがよさげです。
  
Posted by gushwell at 23:43Comments(0)TrackBack(0)

2009年10月14日

タスクトレイにアイコンを表示する際、ウィンドウを表示させないようにするには

   このエントリーをはてなブックマークに追加 Clip to Evernote

Webで検索するといくつかの方法があることが分かりますが、僕が一番良いと思う方法は、
コンポーネントを使う方法です。
以下、その手順を簡単に説明します。

1. 新規プロジェクトでWindowsFormsアプリケーションを選択。
  自動作成されるFormは、タスクトレイをダブルクリックなどした際に
  表示されるフォームとして利用することとします。

2. [プロジェクト]メニューから、[コンポーネントの追加]を選択。
  適当な名前を付け、コンポーネントを作成します。

3. 作成したコンポーネントに、NotifyIconとCotextMenuコントロールを
  貼り付けます。

4. NotifyIconとContextMenuの各プロパティを設定します。CotextMenuのメニュー項目の
  設定がちょっと面倒ですが、そのような場合は、FormでContextMenuを貼り付け、
  編集した後に、カット&ペーストでコンポーネントに貼り付けます。

5. Programs.csのMainメソッドを以下のように書き換えます。
  ※もし、設定ファイルを読み込む必要があるのならば、コンポーネントをnewする
   前に読み込み、その値をコンポーネントのコンストラクタに渡します。

6. NotifyIconとContextMenuのイベントハンドラを記述します。

アプリケーションを終了するには、コンポーネントのソース内(たとえば、
ContextMenuのClickイベント内)で、

といったコードを書いてください。
フォームを表示させるには、たとえば、NotifyIconのダブルクリックイベントで、
のようなコードを書きます。

このやり方の利点は、NotifyIconにかかわるコードと、フォームにかかわるコードを別々のソースに分けて書くことができるという点です。
フォームにNotifyIconコントロールを貼り付けてしまうと、様々なイベントハンドラがひとつのFormクラス内に書かれることになり、見通しの悪いコードになってしまいます。
また、上記方法だと、フォームを非表示にするための特別なコードも書く必要がなくなります。

  
Posted by gushwell at 22:18Comments(0)TrackBack(0)

2009年10月04日

WindowsFormsのListViewのバインディングサンプル

   このエントリーをはてなブックマークに追加 Clip to Evernote
最近、ここに書く話題がなかなか見つからないので、
昔のメモから、WindowsFormsのListViewのバインディングについて。

Northwnd.mdfのOrdersTableを使ったサンプルです。
ADO.NET2.0の型付DataSetを利用しています。

  
Posted by gushwell at 23:50Comments(0)TrackBack(0)

2009年09月09日

Binding.Formatイベント

   このエントリーをはてなブックマークに追加 Clip to Evernote
9月2日にアップした記事「Binding.FormatString プロパティ」の続きです。
バインドする際の表示文字列をカスタマイズするには、System.Windows.Forms.BindinクラスのFormatイベントを使う方法もあります。 Format イベントを処理することにより、データソース上の書式化されていないデータを、表示用の書式化されたデータに変換できます。
たぶんFormatString プロパティよりも、こちらのほうが汎用性がありますね。
コードを示します。

まず、


というイベントハンドラを用意します。
この中で、具体的にどのような表示にするのかを記述し、その結果の文字列をe.Valueにセットします。

で、これをFormatイベントに設定してあげます。


こうすることで、和歴の日付文字列が表示されるようになります。

Formatイベントを使えば、Binding.FormatString プロパティだと実現できないことを実現できるようになります。

もうひとつの方法として、FormatInfoプロパティを使う方法もあるようなのですが、サンプルも無く、どのように使うかわかりませんでした。
  
Posted by gushwell at 22:49Comments(0)TrackBack(0)

2009年09月02日

Binding.FormatString プロパティ

   このエントリーをはてなブックマークに追加 Clip to Evernote
たとえば、WindowsFormsで、DateTime型のデータをTextBoxにバインドしたい場合、 最も簡単な方法は以下のようなコードです。


しかし、これを実行すると、TextBoxには、

2009/03/31 15:09:49

のように表示されます。
でも、和暦で表示したい場合はどうするのかな?、ということで、


として、ApplicationにCurrentCultureをJapaneseCalenderに設定してやりました。
そうすると、

平成 21/3/31 15:11:00

という表示になります。
でも、時分秒は不要です。
フォーマット済みの文字列をTexbBoxにバインドするのは避けたいし、 バインディングをあきらめたくはありません。

そんな時に使えるのが、Binding.FormatString プロパティです。

以下、Binding.FormatString プロパティを使ったコードです。


つまり、表示する際に、now.ToString("ggyy年M月d日"); を呼び出し、文字列にしてしまおうというわけです。
  
Posted by gushwell at 22:36Comments(0)TrackBack(0)

2009年02月23日

WindowsFormsのカーソルが、WaitCursorから変更できない

   このエントリーをはてなブックマークに追加 Clip to Evernote
Visual Studio 2008のデザイナー画面で、FormクラスのCursorプロパティが、WaitCursorから他の値に変更できなくなってしまいました。

「コントロールのロック」をしたわけでもないのに、何で?

と思って、Form1.Designer.csのソースを見てみたら、

this.UseWaitCursor = true;

というコードがありました。
あれ、こんなプロパティ設定したつもりはないんだけど。。。
プロパティウィンドウの操作ミスで、falseからTrueに変更されてしまったみたいです。
このプロパティを falseにしたら、変更できるようになりました。

UseWaitCursorプロパティなんて、いままで気にしたことがなかったので、しばらく悩みました。

※ UseWaitCursorプロパティをTrueに設定すると、現在のコントロールおよびすべての子コントロールに待機カーソルを使用するようになります。  
Posted by gushwell at 23:19Comments(2)TrackBack(0)

2007年08月13日

Control.Invokeの書き方

   このエントリーをはてなブックマークに追加 Clip to Evernote
Control.Invokeの書き方について、ちょっと考察。

private delegate void MyDelegate();

private void MyDisplay() {
label1.Text = "ほにゃらら";
}

private void Foo(...) {
this.Invoke(new MyDelegate(MyDisplay));
}

これが、C#1.1の頃の書き方。

これが C#2.0になると、

private delegate void MyDelegate();

private void Foo(...) {
this.Invoke(new MyDelegate(delegate {
label1.Text = "ほにゃらら";
}));
}

と書ける。さらに、 MethodInvoker という delegateが定義済みなので、

private void Foo(...)  {
this.Invoke(new MethodInvoker(delegate {
label1.Text = "ほにゃらら";
}));
}

とさらに簡単になる。
しかし、次の書き方がどうしてOKなのかが、はっきりとは分からない。

private void Foo(...)  {
this.Invoke((MethodInvoker)delegate {
label1.Text = "ほにゃらら";
});
}

たぶん、

button1.Click += new EventHandler(button1_Click);

が、
button1.Click += button1_Click;

って書けるのと関係しているんだと思うけど...
誰か教えてくれないかな。

...
そんなことより、

private void Foo(...)  {
this.Invoke(delegate {
label1.Text = "ほにゃらら";
});
}

で良いと思うんだけど。これだとエラーになってしまう。
  
Posted by gushwell at 21:17Comments(0)TrackBack(1)