【问题标题】:create an object using a string for the name in C#在 C# 中使用字符串作为名称创建对象
【发布时间】:2011-12-21 19:49:04
【问题描述】:

我可能会走错路,所以我会列出完整的场景......

我有一个 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#(或者就此而言,数据库之外的任何编程)非常陌生,因此将不胜感激!

【问题讨论】:

  • 目标平台是什么?银光? ASP.NET? WPF?表格? (等)一个有效的答案需要这些信息
  • 道歉 - Windows 窗体应用程序...

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


【解决方案1】:

您可以创建一个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"]

【讨论】:

    【解决方案2】:

    只需创建一个复选框字典:

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

    【讨论】:

    • 谢谢你 - 我已经用上一个答案解决了这个问题,但我也会尝试这种方法,看看哪种方法最适合我
    【解决方案3】:

    您可以创建一个复选框对象并设置复选框的名称,如

    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")
        {
            // ...
        }
    }
    

    【讨论】:

      【解决方案4】:

      我不完全确定我是否理解您的问题,但如果您的意图是 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)checkboxes).SyncRoot) { 复选框[cbNewName] = cb; }

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-02
        • 2022-01-15
        • 2019-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多