通过foreach动态添加tabpages,在动态tabpages上添加用户控件
时间: 2023-11-30 14:03:14 浏览: 46
可以按照以下步骤实现:
1. 创建TabControl控件:在窗体上拖拽一个TabControl控件。
2. 动态添加TabPage:使用foreach循环创建多个TabPage,然后将它们添加到TabControl控件中。示例代码如下:
```csharp
foreach (var item in items)
{
var tabPage = new TabPage(item.Name);
tabControl1.TabPages.Add(tabPage);
}
```
3. 创建用户控件:在项目中添加一个用户控件(UserControl),然后在用户控件上添加所需的控件。
4. 在动态创建的TabPage上添加用户控件:使用foreach循环遍历TabControl控件中的所有TabPage,然后在每个TabPage上添加一个用户控件。示例代码如下:
```csharp
foreach (TabPage tabPage in tabControl1.TabPages)
{
var userControl = new MyUserControl();
tabPage.Controls.Add(userControl);
}
```
其中,`MyUserControl`是你在第3步中创建的用户控件类名。
这样就可以通过foreach动态添加TabPages,并在每个TabPage上添加一个用户控件了。
相关问题
C#winfrom 新建winfrom From1窗体,在窗体中添加splitContainer1控件控件上左边制作一个包含父级菜单名称和子级功能选项的功能选项栏,并在顶部增加一个功能搜索栏根据输入的子级功能名称高亮显示出来对应的子级功能,在右边添加 tabControl控件,双击子级调用对应的其他窗体填充到tabControl里的TabPages界面(同时显示出子级功能名称)TabPages根据打开的子级功能自动新增一个将子级调用的其他from窗体填充到里面,同时TabPages名称右边包含关闭(X)功能,点击之后关闭调用的from窗体 实现代码
以下是一个简单的实现过程,仅供参考:
1. 添加控件
首先在Form1窗体中添加SplitContainer控件和TabControl控件,以及一个TextBox控件和一个Button控件作为功能搜索栏。在SplitContainer控件的左侧添加Panel控件,用于实现功能选项栏。
2. 实现功能选项栏
在Panel控件中添加Label控件作为父级菜单名称,以及Button控件作为子级功能选项。在Button控件的Click事件中,双击调用对应的其他窗体,将其填充到TabControl控件的TabPages中,并显示出子级功能名称。
3. 实现功能搜索栏
在TextBox控件的TextChanged事件中,根据输入的子级功能名称高亮显示出对应的子级功能。
4. 实现TabPages功能
在TabControl控件的SelectedIndexChanged事件中,根据选择的TabPages名称,自动新增一个将子级调用的其他Form窗体填充到里面,并在TabPages名称右侧包含关闭(X)功能,点击之后关闭调用的Form窗体。
以下是代码实现:
```csharp
public partial class Form1 : Form
{
private List<Button> buttons = new List<Button>(); // 保存所有子级功能选项按钮的列表
private List<Form> forms = new List<Form>(); // 保存所有打开的Form窗体的列表
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// 添加父级菜单名称
Label label = new Label();
label.Text = "父级菜单名称";
label.Dock = DockStyle.Top;
panel1.Controls.Add(label);
// 添加子级功能选项按钮
for (int i = 0; i < 10; i++)
{
Button button = new Button();
button.Text = "子级功能" + (i + 1);
button.Dock = DockStyle.Top;
button.Click += Button_Click;
panel1.Controls.Add(button);
buttons.Add(button);
}
}
private void Button_Click(object sender, EventArgs e)
{
// 双击调用对应的Form窗体,并将其填充到TabControl控件的TabPages中
Button button = sender as Button;
Form form = new Form();
form.Text = button.Text;
form.TopLevel = false;
form.FormBorderStyle = FormBorderStyle.None;
form.Dock = DockStyle.Fill;
tabControl1.TabPages.Add(button.Text);
tabControl1.TabPages[tabControl1.TabPages.Count - 1].Controls.Add(form);
form.Show();
forms.Add(form);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
// 根据输入的子级功能名称高亮显示出对应的子级功能
foreach (Button button in buttons)
{
if (button.Text.Contains(textBox1.Text))
{
button.BackColor = Color.Yellow;
}
else
{
button.BackColor = Color.White;
}
}
}
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
// 根据选择的TabPages名称,自动新增一个将子级调用的Form窗体填充到里面,并在TabPages名称右侧包含关闭(X)功能,点击之后关闭调用的Form窗体
string tabPageName = tabControl1.SelectedTab.Text;
bool formExist = false;
foreach (Form form in forms)
{
if (form.Text == tabPageName)
{
formExist = true;
break;
}
}
if (!formExist)
{
Form form = new Form();
form.Text = tabPageName;
form.TopLevel = false;
form.FormBorderStyle = FormBorderStyle.None;
form.Dock = DockStyle.Fill;
tabControl1.TabPages[tabControl1.SelectedIndex].Controls.Add(form);
form.Show();
forms.Add(form);
// 在TabPages名称右侧包含关闭(X)功能,点击之后关闭调用的Form窗体
Label label = new Label();
label.Text = " X";
label.Font = new Font("Microsoft Sans Serif", 8.25F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(0)));
label.ForeColor = Color.Red;
label.Cursor = Cursors.Hand;
label.Click += Label_Click;
tabControl1.TabPages[tabControl1.SelectedIndex].Controls.Add(label);
label.Dock = DockStyle.Right;
}
}
private void Label_Click(object sender, EventArgs e)
{
// 关闭调用的Form窗体
Label label = sender as Label;
TabPage tabPage = label.Parent as TabPage;
foreach (Form form in forms)
{
if (form.Text == tabPage.Text)
{
form.Close();
forms.Remove(form);
break;
}
}
tabControl1.TabPages.Remove(tabPage);
}
}
```
winform TabControl添加删除键
在 WinForm TabControl 中添加删除键可以让用户更方便地关闭 TabPage,以下是实现步骤:
1. 在 TabControl 控件上添加一个 ContextMenuStrip 上下文菜单,菜单项为“关闭当前选项卡”。
2. 在 TabControl 的 MouseClick 事件中判断是否右键单击,如果是,则弹出上下文菜单。
3. 在上下文菜单的 Click 事件中关闭当前选项卡。
4. (可选)在 TabControl 控件上添加一个 Button 控件,点击该按钮时关闭当前选项卡。
示例代码如下:
```csharp
public partial class CustomTabControl : TabControl
{
private ContextMenuStrip _contextMenuStrip;
private Button _closeButton;
public CustomTabControl()
{
InitializeComponent();
InitContextMenu();
InitCloseButton();
}
private void InitContextMenu()
{
_contextMenuStrip = new ContextMenuStrip();
var closeMenuItem = new ToolStripMenuItem("关闭当前选项卡");
closeMenuItem.Click += CloseMenuItem_Click;
_contextMenuStrip.Items.Add(closeMenuItem);
}
private void InitCloseButton()
{
_closeButton = new Button
{
Width = 20,
Height = 20,
FlatStyle = FlatStyle.Flat,
ForeColor = Color.Gray,
Font = new Font("Marlett", 8.25f),
Text = "r",
Visible = false
};
_closeButton.Click += CloseButton_Click;
Controls.Add(_closeButton);
}
protected override void OnControlAdded(ControlEventArgs e)
{
base.OnControlAdded(e);
e.Control.MouseEnter += Control_MouseEnter;
e.Control.MouseLeave += Control_MouseLeave;
e.Control.MouseDown += Control_MouseDown;
}
protected override void OnControlRemoved(ControlEventArgs e)
{
base.OnControlRemoved(e);
e.Control.MouseEnter -= Control_MouseEnter;
e.Control.MouseLeave -= Control_MouseLeave;
e.Control.MouseDown -= Control_MouseDown;
}
private void Control_MouseEnter(object sender, EventArgs e)
{
_closeButton.Visible = true;
_closeButton.Top = 2;
_closeButton.Left = GetCloseButtonLeft((TabPage)sender) - _closeButton.Width;
}
private void Control_MouseLeave(object sender, EventArgs e)
{
_closeButton.Visible = false;
}
private void Control_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
SelectedTab = (TabPage)sender;
}
else if (e.Button == MouseButtons.Right)
{
SelectedTab = (TabPage)sender;
_contextMenuStrip.Show(this, e.Location);
}
}
private void CloseMenuItem_Click(object sender, EventArgs e)
{
if (SelectedTab != null)
{
TabPages.Remove(SelectedTab);
}
}
private void CloseButton_Click(object sender, EventArgs e)
{
var closeButton = (Button)sender;
var tabPage = (TabPage)closeButton.Tag;
TabPages.Remove(tabPage);
}
private int GetCloseButtonLeft(TabPage tabPage)
{
var closeButtonWidth = _closeButton.Width;
var closeButtonPadding = 2;
var tabRect = GetTabRect(TabPages.IndexOf(tabPage));
return tabRect.Right - closeButtonPadding - closeButtonWidth;
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
foreach (TabPage tabPage in TabPages)
{
var closeButtonLeft = GetCloseButtonLeft(tabPage);
tabPage.Controls[0].Left = closeButtonLeft;
}
}
}
```
在该自定义控件中,我们添加了一个 Button 控件作为关闭按钮,当用户鼠标移入 TabPage 区域时,该按钮才会显示。同时,我们还添加了一个上下文菜单,用户右键单击 TabPage 时,可以选择关闭当前选项卡。