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

わんくま同盟

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

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


■89470 / )  Re[5]: DataGridViewのカスタム列セル外表示
□投稿者/ 魔界の仮面弁士 (1960回)-(2018/11/30(Fri) 14:27:56)
2018/11/30(Fri) 15:04:31 編集(投稿者)

No89469 (mimio さん) に返信
> sForm.TopLevel = false;

ごめんなさい!
先の No89448 の回答で、TopLevel の true/false を逆に書いていました…。

自分のイメージしていた処理は
 sForm.TopLevel = true; // 初期値で既に true
 sForm.Deactivate += delegate { sForm.Close(); };
 sForm.Show(Form.ActiveForm);
という物です。(子コントロールとするわけではない)

Deactivate イベントは、sForm 以外の場所をクリックした場合に
キャンセル扱いとしてパネルフォームを閉じるために挿入しています。

ただしこの方法だと、ActiveForm がパネルフォーム側に移ってしまうのが難点です。

また、上記は親フォームがモードレスであることを想定しています。

ShowDialog で表示されたモーダル ウィンドウ上にある DataGridView からも
一応呼び出せますが、その場合、そのモーダルウィンドウの
呼び出し元(オーナーウィンドウ)をクリックした場合は、
Deactivate イベントが発生しません。
(モーダルフォーム自身をクリックした場合は、Deactivate が発生する)


> DataGridViewのCell枠内に表示されるので、
> this.Parent.Parent.Controls.Add(sForm);
> としました。

子コントロールとして配置する場合は、こういう風にも書けます。


DataGridView 上に配置したい場合
 // IDataGridViewEditingControl.EditingControlDataGridView プロパティ
 this.EditingControlDataGridView.Controls.Add(sForm);

親 Form 上に配置したい場合
 // Control.FindForm メソッド
 this.FindForm().Controls.Add(sForm);


ただしこの方法をとる場合、Controls.Add メソッドに渡すのは
TopLevel = false な Form ではなく、Panel 等の方が良さそうです。
返信 編集キー/


管理者用

- Child Tree -