【问题标题】:Moving Controls from One Tab Page to Another将控件从一个标签页移动到另一个标签页
【发布时间】:2014-06-19 15:00:55
【问题描述】:

我目前正在开发一个 WinForm 项目,其中有几个不同的选项卡。在每个选项卡中都有各种控件,例如按钮、子选项卡、文本框等...

我需要整合整个应用程序,其中涉及从一个选项卡获取某些控件并将它们移动到另一个选项卡。当我第一次尝试这样做时,我只是复制并粘贴了控件。正如您可以想象的那样,由于我没有使用控件移动属性这一事实,这不起作用,我实际上只是在不同的选项卡上创建了新的。因此,当我编译代码时,没有任何效果,因为没有为新控件分配代码。

当我再次尝试时,这一次我剪切并粘贴它也保持与旧控件相同的属性(特别是代码中的引用名称),据我所知,代码应该通过以下方式识别控件名称,并应用相同的操作。但是,当我编译代码时,应用程序成功构建,但控件不执行任何操作。

此时我不知道该怎么办......

【问题讨论】:

    标签: c# .net winforms tabs


    【解决方案1】:

    使用文档大纲。

    查看...其他窗口...文档大纲。

    选择所需的组件并将其从一个标签页拖到树控件中的另一个。我这样做了,并且这些操作保留在新标签页中。

    【讨论】:

    • 太棒了!以前没用过那个窗口,非常好用!
    【解决方案2】:

    将项目拖出选项卡控件并拖到表单本身上。切换到另一个选项卡。然后将该项目拖到该选项卡中。它本质上是 2 次拖动动作,但由于您从未剪切过,因此所有代码链接都将保持不变。如果您的选项卡控件占据了整个表单,只需在执行上述步骤时将其变小,然后在完成后再次将其变大。

    【讨论】:

    • 这很好用。当我在表单上有很多控件之后想要创建选项卡时,我也使用了它,并且我想将一些控件放在一个选项卡上,而将一些控件放在另一个选项卡上。我刚刚选择了该选项卡,然后将控件从表单拖到该选项卡上。 @DeeWBee 您可能会考虑选择此答案作为首选方法,因为它是在很久以后添加的。
    • @DanG 谢谢。我也这样做了。另一个提示是,如果我一次在选项卡之间移动一堆控件,我将在选项卡中创建一个组,将项目拖动到组中,将组拖动到表单,然后将组拖动到新选项卡,然后最后将控件拖出组。组容器使我可以一起完成它们而不会造成混乱。
    【解决方案3】:

    当您“剪切”控件时,您将切断控件与其各自事件之间的连接。当您再次“粘贴”它们时,它们不再与事件挂钩,因此它们似乎没有任何事情。

    “事件”方法仍应存在于您的代码中,但您必须手动检查每个事件并将每个事件再次订阅到每个控件(通过“属性”窗口)。

    或者,还原这些更改,然后打开 .Designer.cs 文件并查找类似以下内容:

    this.tabPage1.Controls.Add(this.dataGridView1);
    

    哪个(例如)将dataGridView1 放在tabPage1 中。

    如果您想将 DataGridView 移动到另一个 TabPage,只需将上述代码中的 this.tabPage1 更改为 this.tabPage2

    this.tabPage2.Controls.Add(this.dataGridView1);
    

    然后您可以翻回设计器视图并将控件移动到 TabPage 内您想要的任何位置。

    【讨论】:

    • 非常感谢您的建议。你说的对。我确实想在控制时间移动它们。据我所知,当我将控件从一个选项卡移动到另一个选项卡时,自动生成的代码已经自行编辑。
    【解决方案4】:

    我刚刚测试过。当您剪切和粘贴控件时会发生什么,您会丢失事件的连接。剪切粘贴后,你需要去控制properties-events,找到有问题的事件,在右边,选择你要处理该事件的方法。

    【讨论】:

    • 非常感谢!这一直困扰着我!
    • 对,但无论如何它都是 PITA。并且有忘记一些的风险。
    【解决方案5】:

    这将从第一个 TabPage 中剪切它们并将它们粘贴到第二个,我认为您可以随意执行此操作。只需稍加改动,您就可以使其成为真正的副本。 希望对你有帮助

        private void ControlsToTabPage(TabPage from, TabPage to)
        {
            Control[] ctrlArray = new Control[from.Controls.Count];
            from.Controls.CopyTo(ctrlArray, 0);
            to.Controls.AddRange(ctrlArray);
        }
    

    【讨论】:

    • 非常感谢您的建议!非常感谢您的帮助。我是否必须为所涉及的每个控件输入这段代码? (因为有很多)。或者它只是从一个选项卡中获取所有控件并将它们移动到另一个选项卡。
    • 格兰特对我想做的事情是正确的。 T.S.似乎已经解决了它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多