【问题标题】:C# TabControl TabPage passing eventsC# TabControl TabPage 传递事件
【发布时间】:2015-10-21 01:20:17
【问题描述】:

我正在使用 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() 永远不会被调用。我尝试了各种方法,例如 Click 事件等,但无法按预期工作。我错过了什么?

谢谢,马丁

【问题讨论】:

  • 你可以试试 GotFocus 活动:tabPage.GotFocus += ...;或尝试 TabControl 的 Selected 事件:tabControl.Selected += ...(更多信息:msdn
  • 不太清楚你那边发生了什么,但我可以让它在我这边工作。您粘贴的第一段代码实际上是什么时候调用的?你在任何方法之外展示它。请显示正确的代码。这里我把它放在一个 Button.Click 事件处理程序中。

标签: c# events tabcontrol tabpage


【解决方案1】:

这对我来说很好用:

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

当我进入新创建的选项卡时会调用 DoSomething。

当然,first 变量的逻辑可能不是你想要的那样,所以如果你能澄清它的语义,我可以更新我的代码 sn-p。

干杯

【讨论】:

  • 谢谢,但是当你说“当我进入新创建的选项卡时” - 你的意思是当你在查看 Ui 并单击第一个选项卡时?因为我关心的情况是标签被添加到标签控件时(即在用户与 UI 交互之前)。
  • 我不太确定我是否理解您的用例,因为在用户实际与 UI 交互之前不会触发事件。最重要的是,在用户实际“访问” TabPage 之前,不会正确初始化 TabPage 上的控件。例如,这意味着数据绑定在 TabPage 被访问(或激活我认为是正确的词)之前将不起作用。也许如果你真的解释了DoSOmething() 应该做什么,那么我们可以帮助你真正解决你的实际问题。
  • 基本上,我的用例是一个数组中有大约三十个“对象”,我想在一个选项卡上显示每个对象的数据:每个对象一个选项卡。在我的第一个版本中,我只是在创建选项卡时将对象数据添加到每个选项卡,然后将选项卡添加到选项卡控件。这需要大约一分钟的时间(DoSomething() 方法是对象渲染,非常复杂)。我决定更改代码,以便仅实际呈现第一个对象选项卡,而其他选项卡仅在单击时才呈现。这有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多