我遇到了问题。我遇到了很多错误,当我尝试从用户控件添加标签时,这让我很烦。 这是代码
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
}
答案 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 f1
或public
。
答案 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;