Visual C# .NETのShowDialog()について

このQ&Aのポイント
  • 初心者向けにVisual C# .NETのShowDialog()について解説します。
  • sendボタンを押した後に条件によってモーダルダイアログを表示させたい場合、モーダルを開いたまま現在のフォームを閉じる方法について説明します。
  • 条件に合わない場合はフォームに戻り、条件に合えばモーダルを開く処理の実装方法について解説します。
回答を見る
  • ベストアンサー

Visual C# .NETのShowDialog()について

初めまして。最近、C#を始めた者なのですが、 以下の質問をお分かりの方はお手数ですが教えて下さい private void sendButton_Click(object sender, System.EventArgs e){ Form2_2 f22 = new Form2_2(this, m1.Text, m2.Text); if(f22.count == 0){ f22.ShowDialog(); } else{ m1.Text == ""; m2.Text == ""; } } で、このsendボタンを押した後、モーダルダイアログを表示させて、条件に合わない場合はこのフォームに戻り、条件に合えばそのモーダルを開くという事を行いたいのです。 そして今判らないのが、条件にあった際、モーダルは開いたままで、現在のフォームは閉じたいのですが、this.Close(); としても反応がありません。 これはどうしてなのでしょうか? かつ、どうすればこれは解消されるのでしょうか? 長々と失礼しました

質問者が選んだベストアンサー

  • ベストアンサー
  • JeanneNet
  • ベストアンサー率48% (100/208)
回答No.1

こんにちは、じゃんぬねっと です。 モーダルだと、オーナとなるフォームに制御が移らないからです。 ShowDialog の場所で制御が止まっています。 ShowDialog をする前に Hide しておいて、 Close → Dispose をするのを最後にするのが 1 番楽でしょうね。

s1090156
質問者

お礼

大変遅くなり失礼しました じゃんぬねっとさんのやり方を他にも調べたら同じようになっており、理解が高まりました どうもありがとうございました

関連するQ&A

  • Visual C++ 2008 EEでメッセージ表示

    Visual C++ 2008 EEを使用し、以下のコードを組みました。これは1つのフォーム(仮に質問フォームとする)に3つのボタンを作成し、ボタンを押すとそれぞれの3種類の質問項目フォームにいって、質問回答が終わったら再び質問フォームに戻ります。このとき、一度回答した質問項目のボタンは選べないようにしていて、全部の質問に答えた場合(全てのボタンが選べなくなった場合)に「これで質問は終わりです」というようなメッセージを表示したいのですが、方法が分からないのでご教授願います。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { this->Hide(); Sai500^ cSai500 = gcnew Sai500(); cSai500->gvflnm(this->flnm); cSai500->ShowDialog(); this->button1->Visible = false; this->Show(); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { this->Hide(); Sai030^ cSai030 = gcnew Sai030(); cSai030->gvflnm(this->flnm); cSai030->ShowDialog(); this->button2->Visible = false; this->Show(); } private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) { this->Hide(); Sai040^ cSai040 = gcnew Sai040(); cSai040->gvflnm(this->flnm); cSai040->ShowDialog(); this->button3->Visible = false; this->Show(); }

  • C# 引数の渡し方について

    C# 引数の渡し方について //Form1 private void loginbutton_Click(object sender, EventArgs e) { book[] bk = new book[100]; Form2 f = new Form2(bk[0]); f.ShowDialog(this); //モーダルフォーム } public class book { public string name; public int price; } //Form2 public Form2(WindowsFormsApplication1.Form1.book bk) { InitializeComponent(); } Form2にbkの配列のすべてを渡したいのですが今のソースだとbk[0]しかわたせていないようです どうすればbk[0]~bk[99]のすべてを渡せるのでしょうか

  • C#でテキストボックスをクリック→フォームが開く→フォームで設定した値

    C#でテキストボックスをクリック→フォームが開く→フォームで設定した値を元のテキストボックスに入力 こんな感じのことをC#でやりたいのですがよくわからないので教えてください。 1. 親をForm1、子をForm2とします 2. Form1のTextBox1をクリックするとForm2が開いきます 3. Form2で設定した値をForm2の「入力」ボタンを押すとForm2が閉じてTextBox1に値が入力されます というものです。 ここで、textBoxは「クリックしたコントロール名を取得してForm2に渡したい」のです。 テキストボックスがたくさんあるので、textBox1とか決まった名前ではありません。 この部分がわからないのです。 ------------------------------------------------------- Form1: private void textBox1_Click(object sender, EventArgs e) {  Form2 fromItem = new Form2(sender);  DialogResult deRet = fromItem.ShowDialog(); } Form2: public Form2(object sender) {  InitializeComponent();  object pSender = sender; } private void button_input_Click(object sender, EventArgs e) {  ((System.Windows.Forms.TextBox)pSender).text = "hoge"; } ------------------------------------------------------- この程度しかわかりません。 正しい方法を教えてください。よろしくお願いいたします。

  • C# Formの操作

    Form2 form2 ; // 子 Form Form3 form3 ; // 子 Form private void button1_Click(object sender, System.EventArgs e) { form2 = new Form2() ; this.AddOwnedForm(form2) ; // 親 Form が form2 を所有する form2.Show() ; } private void button2_Click(object sender, System.EventArgs e) { form3 = new Form3() ; this.AddOwnedForm(form3) ; // 親 Form が form3 を所有する form3.Show() ; } 上記のようにボタン一つに対して1つのFormに対する処理をするのではなく,ボタン1つに対して 複数のFormを処理する.つまり 例えば,Form1,2,3とあったとして,Form1のボタンを押してFrom2を開き,そこで何らかの処理を したものをForm1に反映する.または,From3のボタンを押してForm2を開きそこで何らかの処理を 行いForm3に反映する. この場合,Form1とForm3のどちらのFormのボタンが押されたか判断しないといけないと思うのですが,ここの処理がうまくいきません. どちらかのFormのボタンを押してForm2を表示し,どちらかのFormに反映させる所までは出来たのですが,両方の判断材料を入れて,どちらのFormのボタンを押されたか判断する際に,押されなかった方が「null」となりエラーになります. 下記にこの判断部分を掲載いたします.どなたかご教授よろしくお願いいたします. Form1 public int but = 0; public int butt1; public string DB; public string HDB; public Form2 f2 = null; private void mybutton1_Click(object sender, EventArgs e) { butt1 = 1; ・ ・ ・ public int Ye=0; private void button43_Click(object sender, EventArgs e) { butt1 = 0; From2 public partial class Form2 : Form { Form1 f1; Form3 f3; public Form2(Form1 f) { f1 = f; // メイン・フォームへの参照を保存 InitializeComponent(); } public Form2(Form3 f) { f3 = f; // メイン・フォームへの参照を保存 InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { #region int Pin1 = f1.butt1; int Pin3 = f3.butt3; Form3 Form1と基本的には同じです.

  • C# フォーム追加後、旧フォームを閉じたい

    前略 ・C#で教えてください。 ・Form1 からshowDiag()メソッドでForm2をつくります。Form2が表示されたら非アクティブとなったForm1を閉じたいのですが どのようにしたらよいのかおしえてください。  下記は、Close() メソッドで Form2側から閉じようとしたプログラムですがFrom1を閉じることができません。 よろしくお願いします。 //----------------------------------------------- namespace formClose { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.ShowDialog(); } }   public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { Form1 form1 = new Form1(); form1.Close(); //Form1が閉じない!! } private void button1_Click(object sender, EventArgs e) { this.Close(); //Form2を閉じる }    } } 以上

  • C#でオブジェクトの有無を取得する

    オブジェクトが作られている時と作られていない時で処理をわけたいのですがうまくいきません。 この書き方の何がまずいのでしょうか? namespace オブジェクト検索 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Control c = Controls["form2"]; if (c != null) { ((TextBox)c).Text += "*"; } } private void button2_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.Show(); Application.DoEvents(); } } } ボタン2を押した時に新しいフォームが立ち上がり、そのフォームがあるときは*が出るようにしたいです。

  • c#で次の次のフォームへのデータの渡し方

    c#で次の次のフォームへのデータの渡し方 お世話になります。 c#初心者です。 フォーム1にはbuttonが2つあり、どちらを押したかで 次(フォーム2)の次のフォーム(フォーム3)を開く時に そのフォームにあるボタンを表示させるか・非表示にさせるか したいと思っております。 中途半端ですが下記の様なコードを書いておりましてその先 フォーム3での記述をどの様に書いたら良いのか行き詰って しまいました。 どなたかご親切な方、ご教示頂きたく宜しくお願い申し上げます。           記 クラス using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WindowsFormsApplication1 { public class Keikaku { public enum Mode { Syuuse, Syoukai } } } ---------------------------------- フォーム1 namespace WindowsFormsApplication1 { public partial class MainMenu : Form { private void button1_Click(object sender, EventArgs e) { Form2 cForm2 = new Form2(); cForm2.Syuusei = Keikaku.Mode.Syuusei; cForm2.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { Form2 cForm2 = new Form2(); cForm2.Syuusei = Keikaku.Mode.Syoukai; cForm2.ShowDialog(); } } } ---------------------------------- フォーム2 namespace WindowsFormsApplication1 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } private Keikaku.Mode _kakunin; public Keikaku.Mode Syuusei { set { _kakunin = value; } } private void button1_Click_1(object sender, EventArgs e) { Form3 cForm3 = new Form3(); cForm3.ShowDialog(); } } } ---------------------------------- フォーム3 namespace WindowsFormsApplication1 { public partial class Form3 : Form { } }

  • C#プログラムにて

    C#プログラムにて お世話になります。 C#初心者です。 プログラムコードを書き始めで、早速行き 詰っています。 ステップでコードの動きを確認したところ、 program.csのMainから下記のForm1.csに 移りForm1のデザイナが表示されるのですが、 button3を押してもForm3が表れません。 また、ステップの黄色いカーソルと言いますか ステップの位置情報も消えています。 何がどう悪いのか分からなく困っています。 どなたかご親切な方、ご教授頂きたく 宜しくお願い致します。     記 using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { Form3 cForm3 = new Form3(); cForm3.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { DialogResult ans; ans = MessageBox.Show("最新のコード表を照会しますか?", "Microsoft Visual Studio", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (ans == DialogResult.OK) Application.Exit(); } private void button12_Click(object sender, EventArgs e) { Form4 cForm4 = new Form4(); cForm4.ShowDialog(); } } }

  • VC++についてエラーC3673の解決方法

    初めてアプリケーションの開発をしている初心者です。 VC++2010のwindowsフォームアプリケーションを使ってアプリケーションの開発をしています。 Form1に配置したbutton1を押すと、Form2がモーダルな状態で実行されるようにしたくて、以下のようなプログラムを書いたのですが、エラーが出てしまいました。 自分でも少し調べてみましたが、解決法がよくわかりません。 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Form2 f2 = gcnew Form2(); f2.ShowDialog(); } エラー error C3673: 'guiapp::Form2' : クラスはコピー コンストラクターを含んでいません Form2の中身に関しては、追加→新しい項目で作ってから手を加えていません。 よろしくお願いします。

  • (Visual C#)カスタムコントロールで作ったリストのプロパティを

    (Visual C#)カスタムコントロールで作ったリストのプロパティを.Items[i]で参照できるように したいです。 具体的に言うと、 Form1…フォームアプリケーション MyList…フォームコントロールライブラリ MyListItem…フォームコントロールライブラリ の3つのソリューションがあります。 Form1にはMyListをデザイナーで、 MyListにはFlowLayoutPanelがあり その中にMyListItemを入れるようにコードを組んであります。 MyList.sln - UserControl1.cs using 省略 namespace MyList { public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } public int Count = 0; public int SelectRow = -1; private MyListItem.MyListItem[] Mylistitem; private void Add (string URL, string Text, string ShowName, string Date){ Mylistitem[Count] = new MyListItem.MyListItem(); Mylistitem[Count].Text = Text + Count.ToString(); Mylistitem[Count].ImageURL = URL; Mylistitem[Count].ShowName = ShowName; Mylistitem[Count].Date = Date; Mylistitem[Count].Name = "MyListItem" + Count; Mylistitem[Count].Parent = this.flowLayoutPanel1; Mylistitem[Count].count = Count; this.Mylistitem[Count].Click += newEventHandler(this.MyListItem_Click); Count++; } private void button1_Click(object sender, EventArgs e) { Add("http://画像URL", "文字列1", "2", "3"); } private void UserControl1_Load(object sender, EventArgs e) { this.Mylistitem = new MyListItem.MyListItem[1000]; } } } MyListItem.sln - UserControl.csは省略します。 ここで質問なんですが、 Form1.csで、 private void TestMethod() { MyList1.Items[i].ImageURL = "http://画像URL"; } のようにしてMyList内のMyListItemのオブジェクト配列のなかで、 Count==iのものを探し、それのImageURLの値を変更することは可能でしょうか? 可能でしたら、その方法またはコードを教えていただけないでしょうか? 検索しても見つからなかったので質問しました。 回答よろしくお願いします。 あ、ちなみにVisual Studio 2010です。

専門家に質問してみよう