我已搜索但找不到此问题。
在代码中的表单1上,我创建一个带有usercontrol的TabPage,然后将TabPage添加到form1.TabControl并在usercontrol上调用公共方法LoadData。 问题:我需要在激活新标签页时重新加载数据或获得焦点。如果我没有在代码中创建tabpage,我可以简单地使用TabControl的selectedIndex更改事件,但它需要在代码中创建。 我怎样才能做到这一点?表格1:
private void CreateNewTab()
{
TabPage tp1 = new TabPage();
tp1.Text = "HSV";
tp1.Name = "tpHSV";
if (tabContMain.TabPages.ContainsKey(tp1.Name) == false)
{
HSVControl hsvc = new HSVControl();
hsvc.Dock = DockStyle.Fill;
hsvc.LoadData();
tp1.Controls.Add(hsvc);
tabContMain.TabPages.Add(tp1);
}
}
==== EDIT =============== 感谢您的评论。让我试着更好地解释我的问题。 selectedIndex更改事件正常工作。我可以通过它的文字或名称访问标签。问题是调用hsvc.LoadData()方法。单击包含hsvc用户控件的选项卡时,我需要调用此方法。 LoadData()是公共的,但是我找不到在Form1中访问它的方法(它包含selectedIndex更改事件)。我需要一个对hsvc控件的引用。
我在Form1类中添加了一个属性,如下所示:
private UserControl mControl;
然后分配它:
HSVControl hsvc = new HSVControl();
hsvc.Dock = DockStyle.Fill;
hsvc.LoadData();
mControl=hsvc;
然后在SelectedIndex更改事件中调用它,但它仍然在那里不可见。
答案 0 :(得分:0)
TabControl
有一个名为SelectedTab
的属性。使用该属性,如:
private void CreateNewTab()
{
TabPage tp1 = new TabPage();
tp1.Text = "HSV";
tp1.Name = "tpHSV";
if (tabContMain.TabPages.ContainsKey(tp1.Name) == false)
{
HSVControl hsvc = new HSVControl();
hsvc.Dock = DockStyle.Fill;
hsvc.LoadData();
tp1.Controls.Add(hsvc);
tabContMain.TabPages.Add(tp1);
tabContMain.SelectedTab = tp1;
}
}
在最后一行中,它使TabControl
调用其SelectedIndexChanged
事件。然后在此事件中调用LoadData事件:
private void TabControl_SelectedIndexChangedEvent(object sender, EventArgs e)
{
//So Because Hsvc is a public field. I call its method here:
if(TabControl.SelectedTab.Name = "My Desired Tab";
{
hsvc.LoadData();
}
}
答案 1 :(得分:0)
好的,再次感谢您的帮助。解决方案有点盯着我的脸。我不确定它是最好的,但是效果非常好。
创建界面:
public interface IControlBase
{
void LoadData();
}
有UserControl实现接口:
HSVControl : UserControl,IControlBase
并在usercontrol上使用现有的LoadData()方法。
变化
private UserControl mControl;
到
private IControlBase mControl;
然后在SelectedIndex中更改:
mControl.LoadData();