从用户控件创建选项卡

本文关键字:选项 创建 控件 用户 | 更新日期: 2023-09-27 18:01:34

我遇到问题了。当我试图从用户控件添加选项卡时,我得到了很多错误,这让我很恼火。下面是代码

public Form1 f1 { get; private set; }
private void button1_Click(object sender, EventArgs e)
{
    TabPage tp = new TabPage { };
    tp.Text = "NewTab";
    tp.Controls.Add(new b());
    f1.tabControl1.TabPages.Add(tp);  //>>> errors here
}

图片查看更多细节:代码no show errors

运行时错误

从用户控件创建选项卡

你的代码没有分配f1,这就是为什么你在运行时得到一个空引用异常。

根据项目的体系结构…

。如果UserControl在后面的父Form代码中实例化,那么只需将f1注入UserControl的构造函数中:

private readonly MyForm _f1;
public b(MyForm f1){
    InitializeComponents();
    _f1 = f1;
}
private void button1_Click(object sender, EventArgs e) {
    TabPage tp = new TabPage { };
    tp.Text = "NewTab";
    tp.Controls.Add(new b());
    //  assumes 'tabControl1' exists as a publicly accessible control
    _f1.tabControl1.TabPages.Add(tp);
}

B。如果使用M-V-P,那么使用您拥有的代码,演示者可以在初始化时分配f1变量,但使setter为publicinternal

f1为null,因为没有给它分配表单。去掉这个属性,改成:

TabPage tp = new TabPage { };
tp.Text = "NewTab";
tp.Controls.Add(new b());
FindForm().Controls.OfType<TabControl>().Single().TabPages.Add(tp);

这假设表单只包含一个TabControl,并且它是一个顶级控件。如果它可以在另一个容器控件中,则必须递归地循环这些控件。这个问题可能会有所帮助:循环遍历表单上的所有控件,甚至是组框

中的控件

请注意,您的方法还有另一个问题:f1类型为Form,但这个通用类型没有tabControl1。您必须使用特定的表单类型MyForm f { get; set; }


也许访问TabControl更简单的方法是让表单实现一个接口,只定义一个返回TabControl的属性:
public interface ITabControlProvider
{
    TabControl MainTabControl { get; }
}

然后让你的表单实现它

public partial class MyForm : Form, ITabControlProvider
{
    ...
    TabControl MainTabControl { get { return tabControl1; } }
}

现在你的UserControl可以像这样找到TabControl

var frm = FindForm() as ITabControlProvider;
if (frm != null) {
    frm.MainTabControl.TabPages.Add(tp);
}

由于这段代码看起来都是从表单内部发生的,您可以尝试:

public Form1 f1 { get; private set; }
private void button1_Click(object sender, EventArgs e)
{
    if(f1 == null) { f1 = this; }
    TabPage tp = new TabPage { };
    tp.Text = "NewTab";
    tp.Controls.Add(new b());
    f1.tabControl1.TabPages.Add(tp);  //>>> errors here
}

如果它发生在UserControl中,那么你可以试试这个:

public Foo : UserControl {
    public TabControl tabControl { get; set; }
    private void button1_Click(object sender, EventArgs e)
    {
        if(tabControl == null) {
            // do nothing - ignore button click.
        } else {
            TabPage tp = new TabPage { };
            tp.Text = "NewTab";
            tp.Controls.Add(new b());
            tabControl.TabPages.Add(tp);  //>>> errors here
        }
    }
}

在您要添加此用户控件的表单上,您可以从属性编辑器中的下拉菜单中选择要绑定到的TabControl,或者您可以像这样在代码中分配它:

foo1.tabControl = tabControl1;