从用户控件创建选项卡
本文关键字:选项 创建 控件 用户 | 更新日期: 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为public
或internal
。
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;