在代码中创建的tabpage上执行方法

时间:2016-06-30 16:30:51

标签: c# winforms events tabpage

我已搜索但找不到此问题。

在代码中的表单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更改事件中调用它,但它仍然在那里不可见。

2 个答案:

答案 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();