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

わんくま同盟

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

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


(過去ログ 149 を表示中)
■86791 / )  Re[1]: メッセージボックスが出ない
□投稿者/ 魔界の仮面弁士 (1592回)-(2018/03/15(Thu) 23:20:07)
2018/03/15(Thu) 23:47:55 編集(投稿者)

No86788 (mbox さん) に返信
> 期待通りにメッセージボックスを出すにはどうすればいいのでしょうか?

Form1 側に手を加えたくないのなら、
UserControl1 側で DoEvents を回すとか。

public UserControl1()
{
 Application.DoEvents(); // ★
 var ret1 = MessageBox.Show("1");
 var ret2 = MessageBox.Show("2 ret1=" + ret1.ToString());
 Controls.Add(new Button());
}



DoEvents を避けたいなら、MessageBoxOptions.ServiceNotification を指定するとか。

public UserControl1()
{
 var ret1 = MessageBox.Show("1", "", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
 var ret2 = MessageBox.Show("2 ret1=" + ret1.ToString(), "", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
 Controls.Add(new Button());
}



ServiceNotification 指定が冗長なら、owner に NativeWindow でも渡しておくとか。

public UserControl1()
{
 var nw = new NativeWindow(); // ★
 var ret1 = MessageBox.Show(nw, "1");
 var ret2 = MessageBox.Show(nw, "2 ret1=" + ret1.ToString());
 Controls.Add(new Button());
}



MessageBox の引数を増やしたくなければ、自身のハンドルを先に作成しておくとか。

public UserControl1()
{
 if(!IsHandleCreated) { CreateHandle(); } // ★
 var ret1 = MessageBox.Show("1");
 var ret2 = MessageBox.Show("2 ret1=" + ret1.ToString());
 Controls.Add(new Button());
}



Form1 側を修正して良いのであれば、Dispose は後で行うようにするとか。

public Form1()
{
 Controls.Add(new UserControl1());
 Menu = new MainMenu(new MenuItem[] { new MenuItem("&File...", (sender, e) =>
 {
  using(var control = Controls[0])
  {
   Controls.Remove(control);
   Controls.Add(new UserControl1());
  }
 })});
}



Dispose は先に行いたいなら、フォーカスを受け取れるダミーコントロールを残しておくとか。

public Form1()
{
 Controls.Add(new UserControl1());
 Controls.Add(new Control()); // ★
 Menu = new MainMenu(new MenuItem[] { new MenuItem("&File...", (sender, e) =>
 {
  var control = Controls[0];
  Controls.Remove(control);
  control.Dispose();
  Controls.Add(new UserControl1());
 })});
}



ダミーコントロールを使いたくないなら、自フォームにフォーカスを戻すとか。

public Form1()
{
 Controls.Add(new UserControl1());
 Menu = new MainMenu(new MenuItem[] { new MenuItem("&File...", (sender, e) =>
 {
  var control = Controls[0];
  Controls.Remove(control);
  control.Dispose();
  Focus(); // ★
  Controls.Add(new UserControl1());
 })});
}
返信 編集キー/


管理者用

- Child Tree -