Как клонировать вкладку "шаблон" на C#

Так что у меня есть вкладка шаблона в моем элементе управления вкладкой, которая содержит многострочное текстовое поле, кнопку, индикатор выполнения и метку. Я попытался найти клонирование страницы вкладки шаблона и добавить ее в свой элемент управления вкладками, но по какой-то причине он зависает в какой-то момент на полпути. Это потому, что на вкладке есть элементы управления внутри? Должен ли я клонировать каждый элемент управления, а затем добавить их на вновь созданную вкладку? Просто ли проще создать эти элементы управления и просто установить значения во время выполнения? Я полагаю, что я, должно быть, делаю это неправильно, потому что мне трудно найти информацию о том, как это сделать.

private void copyControl(Control sourceControl, Control targetControl)
    {
        // make sure these are the same
        if (sourceControl.GetType() != targetControl.GetType())
        {
            throw new Exception("Incorrect control types");
        }

        foreach (PropertyInfo sourceProperty in sourceControl.GetType().GetProperties())
        {
            object newValue = sourceProperty.GetValue(sourceControl, null);

            MethodInfo mi = sourceProperty.GetSetMethod(true);
            if (mi != null)
            {
                sourceProperty.SetValue(targetControl, newValue, null);
            }
        }
    }

Дополнительный вопрос, кажется, что это может иметь совпадение имен, или это не имеет значения, поскольку каждый элемент управления принадлежит отдельной вкладке?

1 ответ

Первая проблема, с которой вы столкнетесь при использовании этого решения, заключается в том, что вы копируете идентификаторы (ы) элемента управления, что создает конфликты в коллекции "Элементы управления" родительского элемента управления.

Кроме того, когда вы вызываете "GetProperties()", вы должны использовать перечисление BindingFlags, чтобы убедиться, что вы получаете только свойства Instance, Public, которые имеют метод доступа "Set". Затем вы можете удалить дополнительный вызов для "GetSetMethod()".

    private void copyControl(Control sourceControl, Control targetControl)
    {
        // make sure these are the same
        if (sourceControl.GetType() != targetControl.GetType())
        {
            throw new Exception("Incorrect control types");
        }

        foreach (PropertyInfo sourceProperty in sourceControl.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty))
        {
            object newValue = sourceProperty.GetValue(sourceControl, null);
            sourceProperty.SetValue(targetControl, newValue, null);
        }
    }
Другие вопросы по тегам