本人之前本来一直使用dotnetbar2中的tabstrip来实现winform多窗体模式,但是后来发现,在窗体最大后之后,查询datagridview之后打开其它的窗体,总会出现创建句柄失败的bug,无法正常show出窗体,后来经过多方查证相关资料发现,此乃dotnetbar2中的bug,无法解决。不过在不懈努力之下终于找到解决办法,dotnatbar2中的tabcontrol其实有着同样的功能,不同的是tabstrip需要将加载的窗体设置为frm.MdiParent = this;才能达到效果。而tabcontrol类似在panel中动态添加form即可,并且同样也带有关闭标志,完美解决dotnetbar2中的tabstrip的bug。写此文的目的主要是在查找上面出现错误时,发现只有提问人,而没有一个解决方法,希望对遇到同样问题的人有所帮助。
TabItem tabItem = tabControl1.CreateTab(frm.Text);
TabControlPanel tcp = new TabControlPanel();
tabItem.AttachedControl = tcp;
tcp.TabItem = tabItem;
tcp.Dock = DockStyle.Fill;
frm.TopLevel = false;
frm.Dock = System.Windows.Forms.DockStyle.Fill;
frm.FormBorderStyle = FormBorderStyle.None;
frm.Show();
tcp.Controls.Add(frm);
tabControl1.Controls.Add(tcp);
tabControl1.SelectedTab = tabItem;
上面代码是将form窗体动态加载到tabcontrol中的例子
tabControl1.AutoCloseTabs = true;
tabControl1.CloseButtonOnTabsVisible = true;
此属性是让tabcontrol标签列上显示关闭图标。
tabControl1.AutoHideSystemBox = false;这样就跟tabstrip一样的效果了哦,如图效果!
/// <summary>
/// 检查是否已打开某个子窗体
/// </summary>
/// <param name="tabName"></param>
/// <returns></returns>
private bool IsOpenTab(string tabName)
{
bool isOpened = false;
foreach (TabItem tab in tabControl1.Tabs)
{
if (tab.Text.Trim() == tabName.Trim())
{
isOpened = true;
tabControl1.SelectedTab = tab;
break;
}
}
return isOpened;
}