Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#选项卡控件选项卡页面传递事件_C#_Events_Tabcontrol_Tabpage - Fatal编程技术网

C#选项卡控件选项卡页面传递事件

C#选项卡控件选项卡页面传递事件,c#,events,tabcontrol,tabpage,C#,Events,Tabcontrol,Tabpage,我正在使用TabControl并将TabPages附加到TabControl,但在使其中一个TabPages响应事件时遇到问题。这让我觉得我遗漏了一些关于这些类之间关系的信息,因此希望能得到一些帮助。我想向TabControl添加一些TabPage对象,对于其中一个对象(第一个添加的对象),我想向它发送一个事件,让它做一些事情 以下是基本代码: /* tabControl is a TabControl object, and tabNames is a string array */ bo

我正在使用TabControl并将TabPages附加到TabControl,但在使其中一个TabPages响应事件时遇到问题。这让我觉得我遗漏了一些关于这些类之间关系的信息,因此希望能得到一些帮助。我想向TabControl添加一些TabPage对象,对于其中一个对象(第一个添加的对象),我想向它发送一个事件,让它做一些事情

以下是基本代码:

/* tabControl is a TabControl object, and 
tabNames is a string array */

bool first = true;
foreach (string tabName in tabNames)
{
    TabPage tabPage = CreateTabPage(tabName);
    tabControl.Controls.Add(tabPage);
    if (first)
    {
        methodTabPage.Select();
        first = false;
    }
}

private TabPage CreateTabPage(String name)
{
    TabPage tabPage = new TabPage(name);
    tabPage.Enter += new EventHandler(MethodTab_Entered);
    return tabPage;
}

private void MethodTab_Entered(object sender, EventArgs e)
{
    DoSomething();
}
当我运行这段代码时,据我所知,DoSomething()从未被调用。我尝试了各种方法,如单击事件等,但无法按预期工作。我错过了什么


谢谢,Martin这对我来说很好:

public partial class TabPageForm : Form
{
    private List<string> tabNames;
    public TabPageForm()
    {
        InitializeComponent();

        tabNames = new List<string>();
        tabNames.Add("NewTab");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        bool first = true;
        foreach (string tabName in tabNames)
        {
            TabPage tabPage = CreateTabPage(tabName);
            methodTabPage.Controls.Add(tabPage);
            if (first)
            {
                methodTabPage.Select();
                first = false;
            }
        }
    }

    private TabPage CreateTabPage(String name)
    {
        TabPage tabPage = new TabPage(name);
        tabPage.Enter += new EventHandler(MethodTab_Entered);
        return tabPage;
    }

    private void MethodTab_Entered(object sender, EventArgs e)
    {
        DoSomething();
    }

    private void DoSomething()
    {
        throw new NotImplementedException();
    }
}
public分部类TabPageForm:Form
{
私人名单;
公共TabPageForm()
{
初始化组件();
tabNames=新列表();
选项卡名称。添加(“新选项卡”);
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
bool first=true;
foreach(tabName中的字符串tabName)
{
TabPage TabPage=CreateTabPage(tabName);
方法tabPage.Controls.Add(tabPage);
如果(第一)
{
methodTabPage.Select();
第一个=假;
}
}
}
私有选项卡页CreateTabPage(字符串名称)
{
TabPage TabPage=新TabPage(名称);
tabPage.Enter+=新事件处理程序(MethodTab_输入);
返回标签页;
}
已输入私有无效方法选项卡(对象发送方、事件参数)
{
DoSomething();
}
私人无效剂量()
{
抛出新的NotImplementedException();
}
}
当我进入新创建的选项卡时,将调用DoSomething

当然,
first
变量的逻辑可能不是您想要的,因此如果您能澄清它的语义,我可以更新我的代码片段


干杯

您可以尝试GotFocus事件:
tabPage.GotFocus+=…
;或者尝试TabControl的Selected事件:
TabControl.Selected+=…
(更多信息:)不太确定您这边发生了什么,但我可以让它在我这边工作。您粘贴的第一段代码何时实际调用?您可以在任何方法之外显示它。请显示正确的代码。在这里,我把它放在一个按钮中。单击事件处理程序。谢谢,但是当你说“当我进入新创建的选项卡时”-你的意思是当你查看Ui并单击第一个选项卡时?因为我所关心的情况是当选项卡被添加到选项卡控件时(即用户与UI交互之前)。我不太确定我是否理解您的用例,因为在用户实际与UI交互之前不会触发事件。除此之外,在用户实际“访问”选项卡页面之前,选项卡页面上的控件不会正确初始化。例如,这意味着数据绑定只有在访问TabPage(或者我认为激活TabPage是合适的词)之后才能正常工作。也许如果你真的解释了
DoSOmething()
应该做什么,那么我们可以帮助你真正解决实际问题。基本上,我的用例是,我在一个数组中有大约三十个“对象”,我想在一个选项卡上显示每个对象的数据:每个对象一个选项卡。在我的第一个版本中,我只是在创建选项卡时将对象数据添加到每个选项卡,然后将选项卡添加到选项卡控件中。这大约需要一分钟的时间(DoSomething()方法是一种非常复杂的对象渲染方法)。我决定更改代码,以便只渲染第一个对象选项卡,其他选项卡仅在单击时渲染。这有用吗?