C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

DataGridViewComboBoxCellで、項目を自分で描画したい


(過去ログ 9 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■9219 / inTopicNo.1)  DataGridViewComboBoxCellで、項目を自分で描画したい
  
□投稿者/ 白やぎ 二等兵(7回)-(2006/12/15(Fri) 17:35:34)

分類:[C#] 


分類:[C#] 

いつも聞くばかりですみません。
今回はDataGridViewComboBoxColumnについてです。


ComboBoxの内容を自分で描画する場合、
DrawModeをOwnerDraw***にして、
OnDrawItemをオーバーライドしてやり、
OnDrawItem内で取得したGraphics
オブジェクトを使って描画できますよね。

こんな感じでDataGridViewComboBoxColumn
のセルに対して自分で描画を行いたいのですが、
どうすれば良いのか分かりません。

どなたかヒントください。
よろしくお願いします。

0
引用返信 編集キー/
■9220 / inTopicNo.2)  Re[1]: DataGridViewComboBoxCellで、項目を自分で描画したい
□投稿者/ 白やぎ 二等兵(8回)-(2006/12/15(Fri) 17:39:03)

分類:[C#] 

> OnDrawItemをオーバーライドしてやり、

おっと、「DrawItemイベントを拾ってやり」
の間違いですね。
オーバーライドはComboBoxを継承する場合ですね。

0
引用返信 編集キー/
■9225 / inTopicNo.3)  Re[2]: DataGridViewComboBoxCellで、項目を自分で描画したい
□投稿者/ 梅林 二等兵(4回)-(2006/12/15(Fri) 22:37:38)

分類:[C#] 

2006/12/15(Fri) 22:41:10 編集(投稿者)
2006/12/15(Fri) 22:40:49 編集(投稿者)

<pre><pre>■No9220に返信(白やぎさんの記事)
> おっと、「DrawItemイベントを拾ってやり」
> の間違いですね。
> オーバーライドはComboBoxを継承する場合ですね。

DataGridViewのEditingControlShowingイベントを使う方法が使えないでしょうか。
以下のようなコードになります。

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control is ComboBox)
{
ComboBox comboBox = e.Control as ComboBox;
comboBox.DrawMode = DrawMode.OwnerDrawFixed;
comboBox.DrawItem += new DrawItemEventHandler(Form1_DrawItem);
}
}

private void Form1_DrawItem(object sender, DrawItemEventArgs e)
{
//OwnerDraw処理
}
</pre></pre>


0
引用返信 編集キー/
■9226 / inTopicNo.4)  Re[3]: DataGridViewComboBoxCellで、項目を自分で描画したい
□投稿者/ 梅林 二等兵(5回)-(2006/12/15(Fri) 22:44:52)

分類:[C#] 

すいません、編集がうまくいかなかったのでもう一度投稿します。

No9220に返信(白やぎさんの記事)
>>おっと、「DrawItemイベントを拾ってやり」
>>の間違いですね。
>>オーバーライドはComboBoxを継承する場合ですね。
>
DataGridViewのEditingControlShowingイベントを使う方法が使えないでしょうか。
以下のようなコードになります。

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control is ComboBox)
{
ComboBox comboBox = e.Control as ComboBox;
comboBox.DrawMode = DrawMode.OwnerDrawFixed;
comboBox.DrawItem += new DrawItemEventHandler(Form1_DrawItem);
}
}

private void Form1_DrawItem(object sender, DrawItemEventArgs e)
{
//OwnerDraw処理
}


0
引用返信 編集キー/
■9229 / inTopicNo.5)  Re[4]: DataGridViewComboBoxCellで、項目を自分で描画したい
□投稿者/ ぽぴ王子 准尉(109回)-(2006/12/16(Sat) 09:06:19)
ぽぴ王子 さんの Web サイト

分類:[C#] 

No9226に返信(梅林さんの記事)

> DataGridViewのEditingControlShowingイベントを使う方法が使えないでしょうか。

ちなみに EditingControlShowing は編集状態になるたびに呼び出されたりする
上に、e.Control は使いまわされたりしているので、このコードだと何度もイベ
ントを追加してしまうかもしれませんね。
一度 -= してから += してみるとか、何らかの工夫が必要かも。

0
引用返信 編集キー/
■9232 / inTopicNo.6)  Re[5]: DataGridViewComboBoxCellで、項目を自分で描画したい
□投稿者/ はつね 一等兵(23回)-(2006/12/16(Sat) 09:41:11)
はつね さんの Web サイト

分類:[C#] 

No9229に返信(ぽぴ王子さんの記事)
> 何度もイベントを追加してしまうかもしれませんね。

何度もイベントを追加してしまうと、なかなか面白い動きになりますよね。
#今回のものではありませんが、以前、やってしまった事があります。


0
引用返信 編集キー/
■9235 / inTopicNo.7)  Re[6]: DataGridViewComboBoxCellで、項目を自分で描画したい
□投稿者/ ぽぴ王子 准尉(111回)-(2006/12/16(Sat) 11:13:43)
ぽぴ王子 さんの Web サイト

分類:[C#] 

No9232に返信(はつねさんの記事)

> 何度もイベントを追加してしまうと、なかなか面白い動きになりますよね。
> #今回のものではありませんが、以前、やってしまった事があります。

ええ、実は私もやったことがあります :-)
そのときはフラグでイベント追加を1回だけにしましたが、.NET的に言えば
(というかC#的?)やはり -= してから += の方が素直なのかな、と。

0
引用返信 編集キー/
■9248 / inTopicNo.8)  Re[5]: DataGridViewComboBoxCellで、項目を自分で描画したい
□投稿者/ 梅林 二等兵(6回)-(2006/12/16(Sat) 23:46:20)

分類:[C#] 

No9229に返信(ぽぴ王子さんの記事)
> ■No9226に返信(梅林さんの記事)
> ちなみに EditingControlShowing は編集状態になるたびに呼び出されたりする
> 上に、e.Control は使いまわされたりしているので、このコードだと何度もイベ
> ントを追加してしまうかもしれませんね。
> 一度 -= してから += してみるとか、何らかの工夫が必要かも。

ぽぴ王子様(王子だから様とお呼びしないと)
ご指摘ありがとうございました。

私自身もこのような書き方でComboBoxにKeyDownイベントを設定し
Deleteキー入力時に、列にDBNull.Valueを設定するというような
ロジックを組んでいたことがあります。

もっとコントロールの内部の仕組みにも注意しなければと反省するしだいです。
今後とも宜しくお願いします。

0
引用返信 編集キー/
■9255 / inTopicNo.9)  Re[6]: DataGridViewComboBoxCellで、項目を自分で描画したい
□投稿者/ 白やぎ 二等兵(9回)-(2006/12/17(Sun) 14:13:15)

分類:[C#] 

梅林さん、ぽぴ王子さん、はつねさん、コメントありがとうございました。
知らないイベントやクラスがたくさんで、ほんと、修行が足りません orz...

で、EditingControlShowingのタイミングでDrawItemイベントにハンドラ突っ込んでみました。
やはりハンドラが複数登録されていますね。
イベントに登録した複数のハンドラ(delegateのリスト的なもの?)を一気に消去する方法とか気になったりして...。
-=でハンドラを削除するにしても、追加したハンドラがどれか分っていなければいけませんよね。
過去にどのハンドラを追加したか分らない場合はどうしたらいいのやら...。

あと、コンボボックスで選んだ後に違うセルにに移動すると、
それまではDrawItemで描画されていたのが、該当アイテムのToString()による
文字列になってしまうんですよ。
これは望む結果ではないです。


もうちょっと悩みそうです。


あ、あとWebには以下のようなコードも落ちてました。
private void dataGridView1_CellClick(object sender,
DataGridViewCellEventArgs e)
{
 if (dataGridView1.Columns[e.ColumnIndex].Name == "YourColumnName")
 {
  dataGridView1.SelectionMode = DataGridViewSelectionMode.CellSelect;
  dataGridView1.BeginEdit(true);
  DataGridViewComboBoxEditingControl comboboxEdit =
   (DataGridViewComboBoxEditingControl)dataGridView1.EditingControl;
  comboboxEdit.DroppedDown = true;
 }
}

URLは
http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic44422.aspx
です。

0
引用返信 編集キー/
■9261 / inTopicNo.10)  Re[7]: DataGridViewComboBoxCellで、項目を自分で描画したい
□投稿者/ 白やぎ 二等兵(10回)-(2006/12/17(Sun) 16:27:54)

分類:[C#] 

> -=でハンドラを削除するにしても、追加したハンドラがどれか分っていなければいけませんよね。
> 過去にどのハンドラを追加したか分らない場合はどうしたらいいのやら...。

ハンドラを指すデリゲートをメンバ変数にしておき、イベントにハンドラをアタッチするときに、ハンドラをメンバであるデリゲートに保存して、ちがうハンドラをアタッチするときにメンバであるデリゲート使って-=することにしました。

private DetachDrawItemEventHandler(ComboBox cmb)
{
 if(this.m_prevHandler != null)
 {
  cmb.DrawItem -= this.m_prevHandler;
  this.m_prevHandler = null;
 }
}

新しいハンドラをアタッチする前にこの関数を呼び出す、みたいな。


しかし、DrawItemで描画した内容が消えて勝手にToString()の内容になる問題がまだ未解決...。

0
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -