Способы динамического создания элементов управления в C # - PullRequest
0 голосов
/ 06 января 2010

Какими способами вы можете динамически создавать элементы управления в C #?

Сначала это были объекты, но было бы точнее сказать «управление».Моя терминология была испорчена.Спасибо, Джоэл.

Редактировать {Элементы управления, созданные во время выполнения.И могут быть доступны и отредактированы программой.Это помогает?}

Мне нравится идея динамического создания, и мне было интересно, как это можно сделать.

Пожалуйста, по одному на каждый ответ, я хотел бы посмотреть, как люди их оценивают.

Например,

private Label _lblCLastName = new Label(); 
private static List<ChildrenPanel> _ListCP = new List<ChildrenPanel>(); 

public void CreatePanel(Panel Container) 
{ 
    // Created Controls
    #region Controls 
    _pnlStudent.Controls.Add(_lblCLastName); 
    //  
    // lblCLastName 
    //  
    _lblCLastName.AutoSize = true; 
    _lblCLastName.Location = new System.Drawing.Point(6, 32); 
    _lblCLastName.Name = "lblCLastName"; 
    _lblCLastName.Size = new System.Drawing.Size(58, 13); 
    _lblCLastName.TabIndex = 10; 
    _lblCLastName.Text = "Last Name"; 

    // Adds controls to selected forms panel 
    Container.Controls.Add(_pnlStudent); 
    // Creates a list of created panels inside the class 
    // So I can access user input 
    ListCP.Add(this); 

} 

Это фрагмент кода из чего-то, что близко к тому, чтоЯ говорю о.Я сделал еще один пост, но не совсем правильно разместил вопрос.Я буду удалять его, но он все еще будет доступен для просмотра.

Если проблемы все еще есть, пожалуйста, будьте конструктивны. Я не возражаю против отрицательного ввода, если он полезен.

Редактировать: я смогчтобы получить ответы, которые я искал.Спасибо всем, кто ответил.Я закрою это, когда смогу.Если кто-то еще может закрыть его, это будет оценено.

Ответы [ 5 ]

9 голосов
/ 06 января 2010

Я использую ключевое слово new для динамического создания объектов.

2 голосов
/ 06 января 2010

Динамическое создание объектов графического интерфейса может быть чрезвычайно полезным, однако, это также может быть кошмаром для обслуживания.

Хорошее практическое правило - ограничивать количество динамически создаваемых объектов GUI.

Одна ситуация, когда вы можете хотеть использовать динамически создаваемый объект GUI, это когда вы не знаете количество или количество нужных вам объектов. Например, одна метка для каждой строки в наборе результатов (даже в этом случае вы можете рассмотреть объект типа DataGrid или GridView).

Это работает как для WinForms, так и для ASP.NET. Просто убедитесь, что ваш код правильно задокументирован.

Мой совет - придерживаться Visual Designer для более простых форм и создавать и добавлять объекты динамически только тогда, когда это абсолютно необходимо.

(FWIW, фрагмент кода, который вы разместили, возможно, может быть упрощен и / или подвергнут рефакторингу, так как кажется, что он движется не в том направлении.)

2 голосов
/ 06 января 2010

Активация (также для удаленных объектов)

Используйте System.Activator class 'перегруженный Activator.CreateInstance методы Это входит в сферу создания объектов локально или удаленно .

using System;

/* Create instances of a Random number generator (or any class)
 *  without using the 'new' operator.
 */
Random rand1 = Activator.CreateInstance<Random>();
Random rand2 = (Random)Activator.CreateInstance(typeof(Random));
//etc...

( Документация MSDN об удаленных объектах. )

2 голосов
/ 06 января 2010

Анонимные типы , C # 3.x

Это довольно динамично, потому что вам не нужно кодировать шаблон класса для получения пользовательских объектов.

// An anonymous object with two properties: obj.Name and obj.Age
var obj = new { Name = "Joe", Age = 35  };

Компилятор выведет Types свойств из предоставленных вами значений инициализации.

Тип недоступен из вашего исходного кода, но его можно увидеть в IL. Однако, если вы создаете несколько анонимных объектов с одинаковыми свойствами, компилятор C # будет использовать один и тот же тип для всех них.

// All objects use the same anonymous type
var obj1 = new { Name = "Joe", Age = 1  };
var obj2 = new { Name = "Art", Age = 30  };
var obj3 = new { Name = "Sally", Age = 25  };

// A different (second) anonymous type
var objDifferent = new { Phone = "555-555-1212", Name = "Joe", Age = 1  };

Предсказания Есть и другие, но они важны.

  • var может использоваться только в области видимости метода (как локальная переменная), но не в области видимости класса.
  • анонимные объекты имеют свойства только для чтения; Вы не можете присвоить им данные.
1 голос
/ 06 января 2010

Предположим, вы говорите о создании динамических объектов:

Вам, очевидно, понадобится библиотека для поддержки этого, если только вы сами не захотите войти в Reflection.Emit - LinFu поддержал это в версии 1:

http://code.google.com/p/linfu/

Тем не менее, эта функция была удалена до версии 2, которую я помню.

...