C#选项卡控件选项卡页面传递事件
我正在使用TabControl并将TabPages附加到TabControl,但在使其中一个TabPages响应事件时遇到问题。这让我觉得我遗漏了一些关于这些类之间关系的信息,因此希望能得到一些帮助。我想向TabControl添加一些TabPage对象,对于其中一个对象(第一个添加的对象),我想向它发送一个事件,让它做一些事情 以下是基本代码: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 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()方法是一种非常复杂的对象渲染方法)。我决定更改代码,以便只渲染第一个对象选项卡,其他选项卡仅在单击时渲染。这有用吗?