0

次のコードでフォームを開くと、いくつかのチェックボックスが作成されます。

    private void OpenFolder_Load(object sender, EventArgs e)
    {
        int i = 0;
        foreach (string file in filesToOpen)
        {
            Label lbl = new Label();
            lbl.Text = Path.GetFileNameWithoutExtension(file);
            lbl.Width = 200;
            lbl.Height = 25;
            lbl.AutoEllipsis = true;
            lbl.Location = new System.Drawing.Point(10, 40 + 25 * i);

            this.Controls.Add(lbl);

            string checkName = "check" + i;
            CheckBox check = new CheckBox();
            check.Checked = true;
            check.AccessibleName = checkName;
            check.Location = new System.Drawing.Point(340, 40 + 25 * i);
            check.CheckedChanged +=new EventHandler(check_CheckedChanged);

            this.Controls.Add(check);

            CheckBoxes.Add(check);

            i++;
        }

OKボタンを切り替えるたびにチェックボックスの状態をチェックしようとしています(チェックボックスが一定数チェックされている場合にのみ、ユーザーは検証できます)

これが私が使用するコードですが、チェックボックスをターゲットにできないため失敗します:

    private void check_CheckedChanged(Object sender, EventArgs e)
    {
        for (int i = 0; i < filesToOpen.Count(); i++)
        {
            string tbarName = "tbar" + i;
            string checkName = "check" + i;

            CheckBox ckb = this.Controls.OfType<CheckBox>()
                     .Where(c => c.AccessibleName.Equals(checkName)) as CheckBox;
            TrackBar tkb = this.Controls.OfType<TrackBar>()
                     .Where(t => t.AccessibleName.Equals(tbarName)) as TrackBar;
            //TrackBar tkb = this.Controls.Find(tbarName, false).First() as TrackBar;
            //CheckBox ckb = this.Controls.Find(checkName, false).First() as CheckBox;

            if (ckb.Checked == true)
            {
                //do stuff
            }
        }
    }

私が間違っている/本当に間違っていることは何ですか?

4

3 に答える 3

1

チェックボックスを独自のリストに追加するとします。

CheckBoxes.Add(check);

ファイルに関連付けられたコントロールを見つけようとするよりも、それをループする方が簡単です。

foreach (var checkBox in CheckBoxes)
{
    if (checkbox.Checked)
    {
        // Do stuff...
    }
}

ただし、別のリストを使用する必要はありません。この行は間違っています:

CheckBox ckb = this.Controls.OfType<CheckBox>()
                   .Where(c => c.AccessibleName.Equals(checkName)) as CheckBox;

Whereは a を返しますが、を返す aIEnumerable<CheckBox>に直接キャストしようとしています。あなたが持っているべきものは次のとおりです。CheckBoxnull

CheckBox ckb = this.Controls.OfType<CheckBox>()
                   .Where(c => c.AccessibleName.Equals(checkName)).First();

nullかどうかを確認する必要がありますがckb(リストに何もない場合に備えて)、探しているコントロールが返されます。

于 2012-07-31T08:15:01.457 に答える
0

すべてのチェックですべてのチェックボックスを繰り返す必要はなく、非常に難しい処理作業です。代わりに、作成するときに、それらを作成した状態を常に把握しているので、「チェック済み」チェックボックスの数を保持するだけです。チェックボックスがオンになっている場合はカウントをインクリメントし、チェックボックスがオフになっている場合はカウントから1を取り出します。そして後でチェックしてください: "if(count == requiredCount){//ここでロジック}"したがって、コードは次のようになります。

private int checkedCount;
private void check_CheckedChanged(Object sender, EventArgs e) 
{
  this.checkedCount += (sender as CheckBox).Checked?1:-1;
  if(this.checkedCount == requiredCount)
  { 
    //do stuff 
  } 
}

開発で頑張ってください。

于 2012-07-31T08:56:27.320 に答える
0

「this」のタイプを確認してから、その Controls コレクションを確認します。チェックボックスは、おそらくツリーの下の数回の繰り返しです。

この記事にあるような再帰的な検索コントロール関数が必要です。

于 2012-07-31T08:12:49.507 に答える