【问题标题】:using winforms (C#) duplicate a row of the form使用 winforms (C#) 复制表格的一行
【发布时间】:2018-10-20 05:18:15
【问题描述】:

我正在尝试设计一个winform。最初的设计有几行,每行都有一个标签、一个数字输入框输入和一个输出文本框。我已经让第一行工作了。

现在我想以编程方式多次复制这一行。我已将组件放入面板(一个容器,没有框架)。然后我希望克隆这个面板及其内容,设置现在位置,并为每个面板添加标签。

我可能会练习如何以编程方式完成这一切。但是我想用布局工具来布局标题和第一行。

我会以一种好的方式解决这个问题吗?我错过了什么。

【问题讨论】:

  • 我认为您的意思是“以编程方式”
  • 你缺少一个网格。
  • 听起来你想要UserControl。它具有完整的设计器支持,并且在表单上它就像一个单独的控件。
  • 我觉得你可以研究一下datagridview
  • @ctrl-alt-delor 有很多关于 UserControls 的资源,我的解释不如那些。看看例如akadia.com/services/dotnet_user_controls.html

标签: c# .net winforms


【解决方案1】:

是的,您可以通过克隆主控件及其所有子控件来继续这个想法。

这是一个示例代码:

namespace CloneAControl
{
    public partial class Form1 : Form
    {
        private int yValue = 50;

        public Form1()
        {
            InitializeComponent();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Panel ctrl = panel1.Clone();
            //Control ctrl = ControlFactory.CloneCtrl(this.panel1);

            this.Controls.Add(ctrl);
            //ctrl.Text = "created by clone";
            ctrl.SetBounds(ctrl.Bounds.X, ctrl.Bounds.Y + yValue,
                           ctrl.Bounds.Width, ctrl.Bounds.Height);
            yValue = yValue + 50;
            ctrl.BackColor = Color.Red;
            ctrl.Show();
        }
    }

    public static class ControlExtensions
    {
        public static T Clone<T>(this T controlToClone)
            where T : Control
        {
            PropertyInfo[] controlProperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

            T instance = Activator.CreateInstance<T>();

            foreach (PropertyInfo propInfo in controlProperties)
            {
                if (propInfo.CanWrite)
                {
                    if (propInfo.Name != "WindowTarget")
                        propInfo.SetValue(instance, propInfo.GetValue(controlToClone, null), null);
                }
            }

            return instance;
        }
    }
}

【讨论】:

    【解决方案2】:

    你有两种方法:

    1. 天真的方法:

    这是在设计视图中创建面板并隐藏除第一个之外的面板,并且您可以通过编程方式根据需要显示和隐藏它们。

    -缺点:

    1. 您要显示的面板数量将固定(有限)

    2. 你根本没有使用OOP的力量。



    1. 更好的方法:

    在您的情况下创建一个面板(行)数组,以存储面板及其所有子控件。

    -缺点:

    1. 您要显示的面板数量仍然固定(有限)

    -解决这个问题:

    查找术语Data structuresGenerics

    List 在您的情况下是不错的选择。

    希望有用。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    相关资源
    最近更新 更多