2011-12-21 73 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()

相关问题