создать объект, используя строку для имени в C # - PullRequest
1 голос
/ 21 декабря 2011

Возможно, я поступаю неправильно, поэтому я изложу полный сценарий ...

У меня есть 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 # (или, если на то пошло, в любом программировании вне базы данных), так что простые термины приветствуются!

Ответы [ 4 ]

4 голосов
/ 21 декабря 2011

Вы можете создать 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 голосов
/ 22 декабря 2011

Я не совсем уверен, что понимаю ваш вопрос, но если вы намереваетесь: 1) добавить новый элемент управления флажок на панель и 2) сохранить ссылку на этот новый объект элемента управления, который вы можете найти позже, основываясь настроковое значение.Если это так, тогда:

  1. Добавьте словарь в свой класс, например:

    using System.Collections.Generic;using System.Windows.Forms;

    ...

    Флажки IDictionary = new Dictionary ();

  2. Создайте новый флажок и назначьте его какобычная переменная, например, :

    CheckBox cb = new CheckBox ();this.testInfoSplitContainer.Panel2.Controls.Add (CB);cb.AutoSize = true;// и т.д. ...

  3. Сохранение ссылки на переменную в словаре, например, так:

    lock (((System.Collections.ICollection) флажки).SyncRoot) {checkboxes [cbNewName] = cb;}

  4. Очистите словарь в переопределенном методе Dispose, например , checkboxes.Clear().

0 голосов
/ 22 декабря 2011

Вы можете создать объект флажка и установить имя флажка как

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 голосов
/ 21 декабря 2011

Просто создайте словарь флажков:

     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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...