投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/8/10 11:35:21
> foreach (Control item in groupBox1.Controls)
登録順に列挙されていませんか?

デザイン時に用意したコントロールならば、Form1.Designer.cs 内で、
 ~.Controls.Add(…);
あるいは
 ~.Controls.AddRange(…);
と記述されている箇所がありますよね。


> if (item.GetType().Equals(typeof(CheckBox)))
『foreach (var chk in groupBox1.Controls.OfType<CheckBox>())』にすれば、
if 文での絞り込みが不要になりますよ。


> CheckBox obj = item as CheckBox;
> if (obj.Checked)
これは誤り。item が CheckBox であることが確実である場合には
 CheckBox obj = (CheckBox)item;
 if (obj.Checked)
と書くべきです。

もしも as を使うのであれば、それが CheckBox とは限らない場面のことなので、
 CheckBox obj = item as CheckBox;
 if (obj != null && obj.Checked)
あるいは
 CheckBox obj = item as CheckBox;
 if (obj?.Checked ?? false)
と書かれるべきかと。


そして、もしも Checked 状態であるものだけを列挙したいのであれば、
『foreach (var chk in groupBox1.Controls.OfType<CheckBox>().Where(c => c.Checked))』
にすれば、そもそも if 文が不要になります。


> // 選択されているなら表示させる。
> chkitem.Add(obj.Tag.ToString() + " ");
> Console.WriteLine("tag: " + obj.Tag.ToString() + " ");
> chkitem.Sort();
> foreach (var i in chkitem) { … }
> chkitem.Clear();

ここの chkitem.Sort(); って意味ありますか?

「1 件 Add しては Clear する処理」を毎回繰り返しているので、
chkitem 内に複数件のデータが存在することはありえないように見えます。