问个白痴问题TabControl 的TabPages切换事件

w_xxxbbb 2018-02-24 05:45:49
功能是这样的,在winform中有TabControl,可以不断增加窗体到TabControl的TabPages中,当切换时,也就是当某个TabPage被选中后,该TabPages中的窗体的某个函数。

TabPage tb = tabControl1.TabPages["frmtodo"]; //新建一个tabpage
if (tb == null)//说明该需要新增的tab不存在
{
frmtodo dataMange = new frmtodo();
addTab(dataMange);
tabControl1.SelectedTab = tabControl1.TabPages["frmtodo"];
}
else
{
tabControl1.SelectedTab = tb;
}

if (e.TabPage== tabControl1.TabPages["frmtodo"])
{
//我期望的就是激活frmtodo窗体中的某一个函数,但是没有成功。
}
...全文
1253 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_xxxbbb 2018-02-27
  • 打赏
  • 举报
回复
多谢各位的热心帮助!
  • 打赏
  • 举报
回复
你的 addTab 是个“黑洞”,你始终就不说明它到底是怎么写的?!! 假设你明知道 TabPage 里边存什么内容,那么直接进行类型声明就行了,例如:
        private void tabControl1_Selected(object sender, TabControlEventArgs e)
        {
            if (e.TabPage== tabControl1.TabPages["frmtodo"] && e.TabPage.Controls.Count > 0)
            {
                var f = (frmtodo)e.TabPage.Controls[0];
                f.xxxxx();
            }
        }
秋的红果实 2018-02-25
  • 打赏
  • 举报
回复
引用 13 楼 w_xxxbbb 的回复:
不行。提示是System.Array不包含Contains的定义]
怎么会有这个提示?
引用 14 楼 a2528490975 的回复:
没看懂,仰望各位 - - 看到好多反射
真心不想用反射,效率不行。 但是按照我#11的写法,无法调用函数 反射写法 假设Form1里面有public方法“函数()”;我代码中的Form1就是你所谓的frmtodo public void 函数() { MessageBox.Show("执行了函数"); }

private void tabControl1_Selected(object sender, TabControlEventArgs e)
{
    if (e.TabPage == tabControl1.TabPages["Form1"])
    {
        //希望在这里执行frmtodo中的一个函数

        foreach (Control control in this.tabControl1.TabPages["Form1"].Controls)
        {
            if(formList.Contains(control))
            {
                control.GetType().GetMethod("函数").Invoke(control, null);
            }
            
        }
    }
}

private List<Form> formList = new List<Form>();

//添加tabPage的button1
private void button1_Click(object sender, EventArgs e)
{
    Form1 f1 = new Form1();
    addTab(f1);
    formList.Add(f1); //注意每添加一个窗体,要加入该list

}

win10,VS2013测试可用
子聪同学 2018-02-25
  • 打赏
  • 举报
回复
没看懂,仰望各位 - - 看到好多反射
w_xxxbbb 2018-02-24
  • 打赏
  • 举报
回复
引用 11 楼 From_TaiWan 的回复:

private Type[] formType = { typeof(Form1), typeof(Form2), typeof(Form3) };
private void tabControl1_Selected(object sender, TabControlEventArgs e)
{
    if (e.TabPage == tabControl1.TabPages["frmtodo"])
    {
        //希望在这里执行frmtodo中的一个函数
        
        foreach (Control control in tabControl1.TabPages["frmtodo"].Controls)
        {
            if (formType.Contains(control.GetType()))
            {
                control.函数();
            }
        } 
    }
}

不行。提示是System.Array不包含Contains的定义
秋的红果实 2018-02-24
  • 打赏
  • 举报
回复
private Type[] formType = { typeof(Form1), typeof(Form2), typeof(Form3) }; 这里的Form1,Form2,Form3就是你的frmtodo,frmrecord等,要出现在tabpage里面的窗体类型 formType可以在Form_load里面初始,或者在某个初始化模块里赋值
秋的红果实 2018-02-24
  • 打赏
  • 举报
回复

private Type[] formType = { typeof(Form1), typeof(Form2), typeof(Form3) };
private void tabControl1_Selected(object sender, TabControlEventArgs e)
{
    if (e.TabPage == tabControl1.TabPages["frmtodo"])
    {
        //希望在这里执行frmtodo中的一个函数
        
        foreach (Control control in tabControl1.TabPages["frmtodo"].Controls)
        {
            if (formType.Contains(control.GetType()))
            {
                control.函数();
            }
        } 
    }
}

w_xxxbbb 2018-02-24
  • 打赏
  • 举报
回复
引用 9 楼 w_xxxbbb 的回复:
[quote=引用 7 楼 From_TaiWan 的回复:] #6做法效率不高,如果你的from是“可控的”,可以在方法外,提前建好窗体,然后在tabpage里面调用

Form[] theForm = { new Form1(), new Form2(), new Form3() };
只是思路
form是已经当触发事件时加载到tabControl1的TabPage中的。希望能在选择一个tabpage时,触发该tabpage中窗体的一个函数。[/quote]
        private void addTab(Form form)
        {
            form.MdiParent = this; //设定为mdi子窗体
            form.TopLevel = false;
            TabPage tb = new TabPage();
            tb.Controls.Add(form); //将窗体添加到form中
            tb.Text = form.Text; //设定tabpage标签
            tb.Name = form.Name; //设定tabpage的name属性,为了之后的新增和销毁处理
            tabControl1.TabPages.Add(tb);
            form.FormBorderStyle = FormBorderStyle.None; //去除原form自带的边框
            form.Dock = DockStyle.Fill; //填充整个tabpage
            form.Show();
        }
以上是将窗体加载到TabPage中的函数
        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {
            TabPage tb = tabControl1.TabPages["frmRecord"]; //新建一个tabpage
            if (tb == null)//说明该需要新增的tab不存在
            {
                frmRecord dataMange = new frmRecord();
                addTab(dataMange);
                tabControl1.SelectedTab = tabControl1.TabPages["frmRecord"];
            }
            else
            {
                tabControl1.SelectedTab = tb;
            }
        }
加载frmRecord
        private void toolStripMenuItem3_Click(object sender, EventArgs e)
        {
            TabPage tb = tabControl1.TabPages["frmtodo"]; //新建一个tabpage
            if (tb == null)//说明该需要新增的tab不存在
            {
                frmtodo dataMange = new frmtodo();
                addTab(dataMange);
                tabControl1.SelectedTab = tabControl1.TabPages["frmtodo"];
            }
            else
            {
                tabControl1.SelectedTab = tb;
            }
        }
加载frmtodo 切换到Tabpages["frmtodo"]时则执行frmtodo中的一个函数,切换到Tabpages["frmRecord"]时则执行frmRecord中的一个函数。
w_xxxbbb 2018-02-24
  • 打赏
  • 举报
回复
引用 7 楼 From_TaiWan 的回复:
#6做法效率不高,如果你的from是“可控的”,可以在方法外,提前建好窗体,然后在tabpage里面调用

Form[] theForm = { new Form1(), new Form2(), new Form3() };
只是思路
form是已经当触发事件时加载到tabControl1的TabPage中的。希望能在选择一个tabpage时,触发该tabpage中窗体的一个函数。
w_xxxbbb 2018-02-24
  • 打赏
  • 举报
回复
引用 6 楼 From_TaiWan 的回复:
把可能用到的form类型都加入数组,然后对tabpage内所有control循环处理,是formType里面的类型就调用函数

Type[] formType = { typeof(frmtodo), typeof(frmrecord), typeof(Form3) };
不是太明白
秋的红果实 2018-02-24
  • 打赏
  • 举报
回复
把可能用到的form类型都加入数组,然后对tabpage内所有control循环处理,是formType里面的类型就调用函数

Type[] formType = { typeof(frmtodo), typeof(frmrecord), typeof(Form3) };
秋的红果实 2018-02-24
  • 打赏
  • 举报
回复
#6做法效率不高,如果你的from是“可控的”,可以在方法外,提前建好窗体,然后在tabpage里面调用

Form[] theForm = { new Form1(), new Form2(), new Form3() };
只是思路
w_xxxbbb 2018-02-24
  • 打赏
  • 举报
回复
引用 3 楼 zbdzjx 的回复:
这样?
        Control.ControlCollection sonControls = tabControl1.TabPages["frmtodo"].Controls;
        foreach (Control control in sonControls)
        {
            if (control is frmtodo)
            {
                frmtodo f2 = (frmtodo)control;
                f2.ShowText();  //frmtodo窗体中的某一个函数
            }
        } 
多谢。如果是多个窗体呢?比如还有个窗体名字是frmrecord,这两个窗体切换时,选中一个窗体则激活该窗体的函数,该如何解决?
w_xxxbbb 2018-02-24
  • 打赏
  • 举报
回复
引用 1 楼 w_xxxbbb 的回复:
怎么是乱码?重新发一遍。 功能是这样的,在winform中有TabControl,可以不断增加窗体到TabControl的TabPages中,当切换时,也就是当某个TabPage被选中后,该TabPages中的窗体的某个函数。
private void toolStripMenuItem3_Click(object sender, EventArgs e)
        {
            TabPage tb = tabControl1.TabPages["frmtodo"]; //新建一个tabpage
            if (tb == null)//说明该需要新增的tab不存在
            {
                frmtodo dataMange = new frmtodo();
                addTab(dataMange);
                tabControl1.SelectedTab = tabControl1.TabPages["frmtodo"];
            }
            else
            {
                tabControl1.SelectedTab = tb;
            }
        }
以上是激活窗体。
        private void tabControl1_Selected(object sender, TabControlEventArgs e)
        {
            if (e.TabPage== tabControl1.TabPages["frmtodo"])
            {
                //希望在这里执行frmtodo中的一个函数
            }
        }
frmtodo是一个窗体,窗体内有函数。
shoppo0505 2018-02-24
  • 打赏
  • 举报
回复
没有成功是指什么?你新建以后,里面没有函数阿。
w_xxxbbb 2018-02-24
  • 打赏
  • 举报
回复
怎么是乱码?重新发一遍。 功能是这样的,在winform中有TabControl,可以不断增加窗体到TabControl的TabPages中,当切换时,也就是当某个TabPage被选中后,该TabPages中的窗体的某个函数。
private void toolStripMenuItem3_Click(object sender, EventArgs e)
        {
            TabPage tb = tabControl1.TabPages["frmtodo"]; //新建一个tabpage
            if (tb == null)//说明该需要新增的tab不存在
            {
                frmtodo dataMange = new frmtodo();
                addTab(dataMange);
                tabControl1.SelectedTab = tabControl1.TabPages["frmtodo"];
            }
            else
            {
                tabControl1.SelectedTab = tb;
            }
        }
以上是激活窗体。
        private void tabControl1_Selected(object sender, TabControlEventArgs e)
        {
            if (e.TabPage== tabControl1.TabPages["frmtodo"])
            {
                //希望在这里执行frmtodo中的一个函数
            }
        }
zbdzjx 2018-02-24
  • 打赏
  • 举报
回复
这样?
        Control.ControlCollection sonControls = tabControl1.TabPages["frmtodo"].Controls;
        foreach (Control control in sonControls)
        {
            if (control is frmtodo)
            {
                frmtodo f2 = (frmtodo)control;
                f2.ShowText();  //frmtodo窗体中的某一个函数
            }
        } 

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧