2012-07-31 62 views
0

我創建了幾個複選框,當我打開一個表格用下面的代碼創建複選框:訪問動態地在C#

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 
      } 
     } 
    } 

我在做什麼錯誤/真的錯了?

+0

它是如何失敗? – ChrisF 2012-07-31 08:12:32

+0

我得到nullreferenceexception,因爲在ckb中沒有任何內容 – 2012-07-31 08:29:40

+0

爲什麼不使用控件的屬性'name'而不是'accessibleName'。如果我不記得這樣做,你可能可以通過'this.Controls [checkName]'' – 2012-07-31 11:28:20

回答

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返回IEnumerable<CheckBox>但你想直接投它的CheckBox將返回null。你應該擁有的是:

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

您仍然需要進行檢查,看是否ckb爲空(以防萬一有什麼就行了),但是這應該回報你,你正在尋找的控制。

+0

'CheckBoxes.Add(check)來訪問它們;''是一個嘗試的餘數,我沒有成功添加複選框事實上這個列表...當試圖添加任何東西時,我得到一個nullreferenceexception – 2012-07-31 08:20:03

+0

@ThomasC - 你是否初始化過「CheckBoxes」? – ChrisF 2012-07-31 08:43:13

+0

謝謝!它解決了問題! – 2012-08-01 00:12:59

0

檢查「this」的類型,然後檢查其控件集合 - 您的複選框可能是樹中的幾次迭代。

你會需要某種形式的遞歸查找控制功能,如一個發現in this article

0

用每次檢查迭代所有複選框並不是必需的,並且只是艱難的處理工作。相反,在創建時,您始終知道您創建了哪些狀態 - 因此只需保留「選中」複選框的計數即可。當檢查的複選框增加計數,並且當一個未選中時 - 從計數中取出1。而後來有一個檢查:「如果(計數== 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 
    } 
} 

與發展的好運氣。