我可能会以错误的方式解决这个问题,所以我将列出完整的方案......
我有一个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,因为我是一个数据库gal,所以这可能意味着我已经编码这一切都错了......
非常感谢任何帮助......我对C#(或者就此而言,数据库之外的任何编程)都很陌生,所以简单的术语将不胜感激!
答案 0 :(得分: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"]
答案 1 :(得分: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;
}
答案 2 :(得分: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")
{
// ...
}
}
答案 3 :(得分:0)
我不完全确定我理解你的问题,但如果你的意图是1)向面板添加一个新的复选框控件,2)保留对该新控件对象的引用,稍后你可以找到它。字符串值。如果那是对的,那么:
在您的课程中添加词典,例如:
使用System.Collections.Generic; 使用System.Windows.Forms;
...
IDictionary checkboxes = new Dictionary();
创建新复选框并将其指定为普通变量例如:
CheckBox cb = new CheckBox(); this.testInfoSplitContainer.Panel2.Controls.Add(CB); cb.AutoSize = true; //等......
在字典中存储对变量的引用,如下所示:
lock(((System.Collections.ICollection)复选框).SyncRoot) { 复选框[cbNewName] = cb; }
清除表单中的字典覆盖Dispose方法,例如,checkboxes.Clear()
。