C# 如何克隆一个;模板";选项卡第C页#

C# 如何克隆一个;模板";选项卡第C页#,c#,clone,tabcontrol,tabpage,C#,Clone,Tabcontrol,Tabpage,因此,我的选项卡控件中有一个模板选项卡页面,其中包含一个多行文本框、一个按钮、一个进度条和一个标签。我尝试搜索克隆模板选项卡页面并将其添加到我的选项卡控件中,但由于某种原因,它在大约完成一半时崩溃。这是因为选项卡页中有控件吗?我是否应该克隆每个控件,然后将它们添加到新创建的选项卡页?创建这些控件并在运行时设置值是否更容易?我想我一定是做错了,因为我很难找到这样做的信息 private void copyControl(Control sourceControl, Control targetCo

因此,我的选项卡控件中有一个模板选项卡页面,其中包含一个多行文本框、一个按钮、一个进度条和一个标签。我尝试搜索克隆模板选项卡页面并将其添加到我的选项卡控件中,但由于某种原因,它在大约完成一半时崩溃。这是因为选项卡页中有控件吗?我是否应该克隆每个控件,然后将它们添加到新创建的选项卡页?创建这些控件并在运行时设置值是否更容易?我想我一定是做错了,因为我很难找到这样做的信息

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

附带问题,这似乎可能有名称重叠,或者这无关紧要,因为每个控件都属于不同的选项卡页?

此解决方案遇到的第一个问题是复制控件ID,这将在父控件的“控件”集合中创建冲突

另外,在调用“GetProperties()”时,应该使用BindingFlags枚举确保只获取具有“Set”访问器的实例公共属性。然后可以删除对“GetSetMethod()”的额外调用


嗯,当它到达System.Drawing.Size PreferredSize时,它似乎仍然失败。您收到的错误消息是什么?另外,你能举一个打电话的例子吗?我假设您在调用它之前创建了“targetControl”(或者您将得到一个NullReferenceException)。您是在调用此方法之前还是之后将目标添加到父级的控件集合?
    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);
        }
    }