使用C#中的名称字符串创建对象

时间:2011-12-21 19:49:05

标签: c# .net winforms visual-studio-2010

我可能会以错误的方式解决这个问题,所以我将列出完整的方案......

我有一个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#(或者就此而言,数据库之外的任何编程)都很陌生,所以简单的术语将不胜感激!

4 个答案:

答案 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)保留对该新控件对象的引用,稍后你可以找到它。字符串值。如果那是对的,那么:

  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. 在字典中存储对变量的引用,如下所示:

    lock(((System.Collections.ICollection)复选框).SyncRoot) {     复选框[cbNewName] = cb; }

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