【问题标题】:Execute method on tabpage created in code在代码中创建的标签页上执行方法
【发布时间】:2016-11-02 21:12:45
【问题描述】:

我已经搜索过,但找不到这个问题。

在代码中的表单 1 上,我创建了一个包含用户控件的 TabPage,然后将 TabPage 添加到 form1.TabControl 并在用户控件上调用公共方法 LoadData。 问题:当新标签页被激活或获得焦点时,我需要重新加载数据。如果我没有在代码中创建标签页,我可以简单地使用 TabControl 的 selectedIndex 更改事件,但它需要在代码中创建。 我怎样才能做到这一点?表格一:

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);

        }

    }

====编辑================ 感谢cmets。让我试着更好地解释我的问题。 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 更改事件中调用它,但它仍然在那里不可见。

【问题讨论】:

  • 在这里使用相同的事件。您可以在代码中分配事件处理程序。请参阅此 msdn example。或者查看您的设计器生成的代码,了解它如何处理事件。或者在你的方法中写tabContMain.SelectedIndexChange +=,然后按两次Tab键。
  • 似乎TabControl.SelectedIndexChanged 应该可以正常工作。你遇到什么麻烦了?只是您无法在该事件处理程序中引用 hsvc 吗?如果是这样,只需在表单类中添加一个字段来保存对它的引用。
  • 所以在SelectedIndexChanged 事件中调用hsvc.LoadData()。现在我改变了答案。

标签: c# winforms events tabpage


【解决方案1】:

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();
    }
}

【讨论】:

    【解决方案2】:

    好的,再次感谢您的帮助。解决方案有点像盯着我看。我不确定它是不是最好的,但效果很好。

    创建的界面:

      public interface IControlBase
    {
        void LoadData();
    }
    

    有UserControl实现接口:

     HSVControl : UserControl,IControlBase
    

    并且在用户控件上具有现有的 LoadData() 方法。

    改变

    private UserControl mControl; 
    

    private IControlBase mControl;
    

    然后在 SelectedIndex 中改变:

    mControl.LoadData();
    

    【讨论】:

    • ...或者您可以将mControl 声明为HSVControl 并完全跳过IControlBase
    • 是的,你是对的。测试并且工作正常。我会将其保留为界面,因为我将拥有更多具有类似需求/控件的选项卡。感谢您的提示。
    • 从设计的角度来看,为这个和未来类似的TabPages 定义一个接口而不是严格按照它们的实际类型来引用它们的唯一优点是能够通用地对待它们(例如,通过它们的数组到一个函数,该函数接受它们为IControlBase 并在它们上调用IControlBase 方法)。即使此类代码需要接口,最好将字段声明作为其实际类型的实例,这样您就可以在代码中的其他地方调用特定于类型的方法,而无需先将它们转换回到他们的实际类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2023-01-10
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多