从用户控件制作选项卡

时间:2016-08-08 19:28:04

标签: c# winforms tabcontrol

我遇到了问题。我遇到了很多错误,当我尝试从用户控件添加标签时,这让我很烦。 这是代码

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
}

Image for more details: code no showing errors

Run-time errors

3 个答案:

答案 0 :(得分:6)

您的代码未分配{{ content() }},这就是您在运行时获取空引用异常的原因。

取决于项目的架构......

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

UserControl

B中。如果使用M-V-P,那么,使用您拥有的代码,Presenter可以在初始化时分配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); } 变量,但可以设置setter f1public

答案 1 :(得分:0)

f1为null,因为没有为其分配任何表单。删除此属性,然后写:

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

这假定表单只包含一个TabControl,并且它是顶级控件。如果它可以在另一个容器控件中,则必须递归循环控件。这个问题可能有所帮助:Loop through all controls on a form, even those in groupboxes

请注意,您的方法还有另一个问题: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);
}

答案 2 :(得分:0)

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

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;