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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

820閲覧

チェックリストボックスにチェック後(2回目以降)、フォームが二回表示される

sueteacher

総合スコア48

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2022/06/01 03:10

編集2022/06/01 04:46

【質問】
・2回目以降のチェックからフォームが二回表示されるようになっているため、一度だけ表示したい。
・チェックリストボックスのチェックが複数チェックできてしまうので、1つだけチェックできるようにしたい。

【実装する目的】
・検索をした際に、検索した値が複数もしくは単一でチェックリストボックスに表示されるため、チェックボックスを一つだけ選択できるようにし(複数チェック不可)、チェックボックスをクリックすると違うフォームを表示するようにしたい。
※チェックしたときにフォームが二回表示されることがあるためチェックボックスの方から検証

【仮説】
・チェックが二回扱いになっている?
・チェックの動作から確認

【流れ】
テキストボックスに入力し、検索ボタンを押すと、チェックリストボックスに表示され、チェックすると別のフォームを表示

【相談前実装】
参考記事を参照し、実装しました。
キータの記事を参考に試しに動かしてみるとクリック回数を重ねるにつれてフリーズする。ため1行コメントアウトして実装
マイクロソフトの記事を参考にしましたが、どこのファイルに何を記述すればいいのかがわからなかったため、実装中止。
チェックは一つになりましたが、二回目以降のチェック後、フォームが出現し、閉じると、また同じフォームが出現

■Form1.cs[デザイン]
checkedListBox1のプロパティ変更
CheckedOnClick: true
SelectionMode: One
Tab index:1
ThreeDCheckBoxes: true

■Form1.cs

c#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.IO; 10using System.Windows.Forms; 11 12namespace csvreadtest 13{ 14 15 public partial class Form1 : Form 16 { 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21    private void Form1_Load(object sender, EventArgs e) 22 { 23 checkedListBox1.Items.Add("りんご"); 24 checkedListBox1.Items.Add("おれんじ"); 25 checkedListBox1.Items.Add("みかん"); 26 checkedListBox1.Items.Add("もも"); 27 checkedListBox1.Items.Add("すいか"); 28 checkedListBox1.Items.Add("ぎんなん"); 29 } 30 31 //クリックが二回判定? 32 int lastCheckedIndex = -1; 33 private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) 34 { 35 if (e.Index != lastCheckedIndex) 36 { 37 if (lastCheckedIndex != -1) 38 checkedListBox1.SetItemCheckState(lastCheckedIndex, CheckState.Unchecked); 39 lastCheckedIndex = e.Index; 40 } 41 //フォーム2を表示 42 Form2 form2 = new Form2(); 43 form2.ShowDialog(); 44 } 45 //To register event 46 //checkedListBox1.ItemCheck += checkedListBox1_ItemCheck; //エラーのためコメントアウト 47   48 49 } 50}

■Form2.cs

c#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace csvreadtest 12{ 13 public partial class Form2 : Form 14 { 15 public Form2() 16 { 17 InitializeComponent(); 18 } 19 20 private void button1_Click(object sender, EventArgs e) 21 { 22 this.Close(); 23 } 24 25 private void button2_Click(object sender, EventArgs e) 26 { 27 this.Close(); 28 } 29 } 30}

【使用環境】
C# visual studio2022 .net framework windowsForm
【参考記事】
QIITA
https://qiita.com/noixip/items/3d1bd016b4cecfb48d2e
※実装しましたが、チェックをしすぎるとフリーズする。
microsoft
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.checkedlistbox.checkonclick?view=windowsdesktop-6.0

プログラミング初心者です。
プログラマーの先輩方にご教授いただければ幸いです。よろしくお願いいたします。

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

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

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

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

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

dodox86

2022/06/01 03:48

提示のコードを読んで: 省略し過ぎてForm2がShowDialog()される位置が変なところになっています。この位置ではコンパイルエラーでは?
退会済みユーザー

退会済みユーザー

2022/06/01 04:21 編集

提示されてないコードが影響しているのではないですか? > チェックリストボックスのチェックが複数チェックできてしまうので、1つだけチェックできるようにしたい。 それは参考にした Stackoverflow の記事の通りにして可能なはずです。 > 2回目以降のチェックからフォームが二回表示されるようになっているため、一度だけ表示したい。 それも提示したコードでそのようになると思いますけど? 試してみますね。
sueteacher

2022/06/01 04:50

最低限の記述に修正しました。 二回目以降は、新しいフォームをボタンで閉じるとまたフォームがでてきます。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2022/06/01 05:31 編集

試してみました。 > チェックリストボックスのチェックが複数チェックできてしまうので、1つだけチェックできるようにしたい。 Stackoverflow の記事の通りにして問題なく可能でした。 > 2回目以降のチェックからフォームが二回表示されるようになっているため、一度だけ表示したい。 2回目以降は先に選択した項目のチェックを SetItemCheckState メソッドで外すようにしていますが、外した際に再度 ItemCheck イベントが発生するからでした。 あとで回答欄にそれを回避するための案を書いておきます。
sueteacher

2022/06/01 05:35

ありがとうございます。無事に動きました。
guest

回答1

0

ベストアンサー

試してみました。

チェックリストボックスのチェックが複数チェックできてしまうので、1つだけチェックできるようにしたい。

Stackoverflow の記事の通りにして問題なく可能でした。

2回目以降のチェックからフォームが二回表示されるようになっているため、一度だけ表示したい。

2回目以降は先に選択した項目のチェックを SetItemCheckState メソッドで外すようにしていますが、外した際に再度 ItemCheck イベントが発生するからでした。

質問者さんのコードの「//フォーム2を表示」以下の 2 行を if (e.Index != lastCheckedIndex) に移動すればその問題は避けることができるはずです。

試したコードを載せておきます。Form5 を新規に作ってデザイン画面で CheckListBox を Form にドラッグ&ドロップし、ItemCheck イベントのハンドラを生成しています。

C#

1using System.Windows.Forms; 2 3namespace WindowsFormsApp1 4{ 5 public partial class Form5 : Form 6 { 7 public Form5() 8 { 9 InitializeComponent(); 10 11 string[] myFruit = { "りんご", "おれんじ", "みかん", "もも", "すいか", "ぎんなん" }; 12 checkedListBox1.Items.AddRange(myFruit); 13 14 checkedListBox1.CheckOnClick = true; 15 16 } 17 18 int lastCheckedIndex = -1; 19 20 private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) 21 { 22 if (e.Index != lastCheckedIndex) 23 { 24 if (lastCheckedIndex != -1) 25 { 26 checkedListBox1.SetItemCheckState(lastCheckedIndex, CheckState.Unchecked); 27 } 28 lastCheckedIndex = e.Index; 29 30 31 Form1 form1 = new Form1(); 32 form1.ShowDialog(); 33 } 34 } 35 } 36}

投稿2022/06/01 05:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問