2011-12-21 62 views
1

我可能要對這個錯誤的方式,所以我設置了完整的方案字符串對象...創建使用C#中的名稱

我有一個DataTable持有多個項目 - 像股票項目。該表中的數據可能會發生變化,但它會從數據庫填充,因此它是一個不同的列表。我希望用戶能夠選擇它們中的一些,並且我想通過爲DataTable中的每個項目創建一個新的CheckBox對象來實現這一點。

到目前爲止,我有以下(我知道是錯的,但說明了什麼,我想要知道的!):

string cbName = "cbNewTest"; 
int cbPosition = 24; 
int cbTab = 1; 

foreach (DataRow row in tblAllTests.Rows) 
{ 
    string cbNewName = cbName + cbTab.ToString(); 
    this.(cbNewName) = new System.Windows.Forms.CheckBox(); 
    this.testInfoSplitContainer.Panel2.Controls.Add(this.(cbNewName)); 

    this.(cbNewName).AutoSize = true; 
    this.(cbNewName).Location = new System.Drawing.Point(6, cbPosition); 
    this.(cbNewName).Name = cbNewName; 
    this.(cbNewName).Size = new System.Drawing.Size(15, 14); 
    this.(cbNewName).TabIndex = cbTab; 
    this.(cbNewName).Text = row["itemDesc"].ToString(); 

    cbPosition = cbPosition + 22; 
    cbTab = cbTab + 1; 
} 

所以當然問題是在括號中的東西。基本上,我想這是任何在我的字符串'cbNewName',但我真的不知道如何做到這一點...我習慣於SQL,因爲我是一個數據庫加侖,所以這可能意味着我已經編碼這一切都是錯誤的...

任何幫助將非常讚賞......我是非常新的C#(或者對於這一點,任何編程數據庫之外的編程)如此簡單的條款將不勝感激!

+0

什麼是目標平臺? Silverlight的? asp.net? WPF?的WinForms? (等)有效答案需要此信息 – 2011-12-21 19:50:44

+0

道歉 - windows窗體應用程序... – Elatesummer 2011-12-21 19:51:20

回答

4

您可以創建一個CheckBox作爲變量,就像其他任何東西一樣。沒有必要把它分配給Form的屬性,這是不可能的一個生成動態不管:

CheckBox newCheckBox = new CheckBox(); 

// (Initialize your new CheckBox here, basically exactly as you're 
// already doing except instead of this.(cbNewName) you use newCheckBox) 

this.testInfoSplitContainer.Panel2.Controls.Add(newCheckBox); 

如果以後需要訪問它,因爲你已經設置的名稱,只是做:

(CheckBox)this.testInfoSplitContainer.Panel2.Controls["theName"] 
+0

工作完美,謝謝! – Elatesummer 2011-12-21 20:01:41

0

只需創建一個複選框詞典:

 var mycbs = new Dictionary<string,<System.Windows.Forms.CheckBox>>(); 

    foreach (DataRow row in tblAllTests.Rows) 
    { 
     string cbNewName = cbName + cbTab.ToString(); 

     mycbs[cbNewName] = new System.Windows.Forms.CheckBox(); 
     this.testInfoSplitContainer.Panel2.Controls.Add(mycbs[cbNewName]); 

     mycbs[cbNewName].AutoSize = true; 
     mycbs[cbNewName].Location = new System.Drawing.Point(6, cbPosition); 
     mycbs[cbNewName].Name = cbNewName; 
     mycbs[cbNewName].Size = new System.Drawing.Size(15, 14); 
     mycbs[cbNewName].TabIndex = cbTab; 
     mycbs[cbNewName].Text = row["itemDesc"].ToString(); 

     cbPosition = cbPosition + 22; 
     cbTab = cbTab + 1; 
    } 
+0

謝謝你 - 我已經和前面的答案一起工作了,但我也會用這個方法來看看哪種方法最適合我 – Elatesummer 2011-12-21 20:05:53

0

您可以創建一個複選框對象,並設置像

的複選框的名稱
CheckBox c = new CheckBox(); 
c.Name = "CheckBoxName"; 

,當你需要訪問此複選框,然後你可以使用名稱,如區分:

// Loop through all controls 
foreach (Control tempCtrl in this.Controls) 
{ 
    // Determine whether the control is CheckBoxName, 
    // and if it is, do what ever you want 
    if (tempCtrl.Name == "CheckBoxName") 
    { 
     // ... 
    } 
} 
0

我不能完全肯定我理解你的問題,但如果你的目的是1 )爲面板添加一個新的複選框控件,並2)保留對新控制對象的引用,您可以根據字符串值稍後查找該對象。如果這是正確的,那麼:

  1. 添加字典到您的類,是這樣的:使用System.Collections.Generic

    ;使用System.Windows.Forms的 ; IDictionary checkboxes = new Dictionary();這是一個新的字典()。

  2. 創建您的新複選框並將其指定爲普通變量

    CheckBox cb = new CheckBox(); this.testInfoSplitContainer.Panel2.Controls.Add(cb); cb.AutoSize = true; //等等...

  3. 商店中的參考在字典中的變量,像這樣:

    鎖(((System.Collections.ICollection)複選框).SyncRoot) { 複選框[cbNewName] = CB; }

  4. 清除表單中被覆蓋的字典Dispose方法,例如,checkboxes.Clear()

相關問題