none
Как полностью копировать контрол winForms? RRS feed

  • Вопрос

  • Тоесть имеется собственный контрол наследуемый от класса Control Нужно создать несколько его копий именно копий а не ссылок на него. Т.к. надо каждый из них поместить на отдельные панели.
    23 февраля 2011 г. 9:44

Ответы

  • попробуйте следующий подход

    private object CloneControls(object o)
    {
    
    Type type = o.GetType();
    PropertyInfo[] properties = type.GetProperties();
    Object retObject = type.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, o, null);
    foreach (PropertyInfo propertyInfo in properties)
    {
    if (propertyInfo.CanWrite)
    {
    propertyInfo.SetValue(retObject, propertyInfo.GetValue(o, null), null);
    }
    }
    return retObject;
    }
    
    взял код отсюда

    суть в том, что с помощью рефлексии вы пробегаетесь по всем свойствам контрола и

    если возможно - устанавливаете их в новом контроле

    • Помечено в качестве ответа Abolmasov Dmitry 24 февраля 2011 г. 15:00
    23 февраля 2011 г. 17:37

Все ответы

  • перетащите из тулбокса ваш кантрол на каждую из панелей

    или если вы создаете его динамически - вызывайте оператор new для каждого нового контрола

    и помещайте полученный контрол в коллекцию контролов панели

    MyControl ctr1 = new MyControl();

    panel1.Controls.Add(ctr1);

    MyControl ctr2 = new MyControl();

    panel2.Controls.Add(ctr2);

    23 февраля 2011 г. 10:06
  • Я не совсем это имел ввиду. Мне нужна полная копия уже имеющегося контрола со всеми его свойствами. Хотел узнать нет ли каких то стандартных методов для этого..
    23 февраля 2011 г. 12:23
  • попробуйте следующий подход

    private object CloneControls(object o)
    {
    
    Type type = o.GetType();
    PropertyInfo[] properties = type.GetProperties();
    Object retObject = type.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, o, null);
    foreach (PropertyInfo propertyInfo in properties)
    {
    if (propertyInfo.CanWrite)
    {
    propertyInfo.SetValue(retObject, propertyInfo.GetValue(o, null), null);
    }
    }
    return retObject;
    }
    
    взял код отсюда

    суть в том, что с помощью рефлексии вы пробегаетесь по всем свойствам контрола и

    если возможно - устанавливаете их в новом контроле

    • Помечено в качестве ответа Abolmasov Dmitry 24 февраля 2011 г. 15:00
    23 февраля 2011 г. 17:37