質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

355閲覧

指定フォームの閉じ方(C#)

Reindeer_Csharp

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/06/24 00:35

前提

C#でソフト制作しています。
別フォームを消したくて、コードを組んだのですが、出たら消えずに増えていく一方になっています。何が良くないのかアドバイスしてくれると嬉しいです。

実現したいこと

トグルの実装(親フォームから指定フォームを出したり閉まったり)

発生している問題・エラーメッセージ

閉じられずに増えていく

該当のソースコード(Form1側)

フォームは2つ、form2には特にコードなし

C#

1 public static int i = 0; 2 3 private void Button1_Click(object sender, EventArgs e) 4 { 5 Form2 view = new Form2(); 6 if (i == 0) 7 { 8 i++; 9 view.Show(); 10 } 11 else 12 { 13 i--; 14 view.Close(); 15 } 16 }

試したこと

Closeなどを試してみました。

補足情報(FW/ツールのバージョンなど)

VisualStudio Community v17.2.5
コード:C#
フォームアプリケーションの形で制作しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C#

1 public static int i = 0; 2 Form2 view; 3 private void Button1_Click(object sender, EventArgs e) 4 { 5 if (i == 0) 6 { 7 view = new Form2(); 8 i++; 9 view.Show(); 10 } 11 else 12 { 13 i--; 14 view.Close(); 15 } 16 }

投稿2022/06/24 00:39

ozwk

総合スコア13528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Reindeer_Csharp

2022/06/24 00:45

なるほど、静的の方で命名して中で初期化したらいいんですね。勉強になりました。
ozwk

2022/06/24 00:58 編集

静的(static)フィールドにはしていません。 そういえば 変数 i について、 このコード片だけだとイマイチ判断できませんが、静的フィールドにする意味がいまいち感じられません。
退会済みユーザー

退会済みユーザー

2022/06/24 01:02 編集

質問者さん> 横レス失礼します。「静的」とは何を言っているのか不明ですが、変数のスコープと値型/参照型の違いあたりの問題なのでその辺を調べてみることをお勧めします。
Reindeer_Csharp

2022/06/24 01:03

変数iは仮置きの感覚で置いています。置く場所がいまいちわからなくてとりあえず一番上に置こうかなと思いました。
Reindeer_Csharp

2022/06/24 01:04

進められたとおりに値型/参照型について調べていきます。ありがとうございます。
KOZ6.0

2022/06/24 02:02 編集

3点ほど (1) i は他からアクセスされることを想定していますか?でなければ private にすべきです。 (2) i と view は対になるものですから、両方静的メンバーにするか、両方インスタンスメンバーにするか統一したほうが良いです。 Form1 はひとつしか開かないというのであれば大丈夫ですが、複数開いたとき異常終了する可能性があります。 両方静的メンバーだと、Form1 が何枚開いても Form2 はひとつしか存在しません。 両方インスタンスメンバーだと、Form1 が複数開いた場合、それぞれの Form1 に対し、Form2 がひとつずつ存在することになります。 (3) インスタンスを保持する明確な理由がない限り、Form2 を閉じたあと、view2 に null を代入してください。GC が回収できません。
Zuishin

2022/06/24 03:54 編集

bool もどきの使い方しかしていないのに int なのが気になります。 view クローズで null にするのであれば、それで判定すれば i は要らないように思います。 new Close の代わりに Show Hide でも良さそうに思います。その場合は Visible = !Visible に短縮化できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問