SplitContainer(分割容器)控件详解
本文面向零基础小白,所有代码都带详细注释。SplitContainer 用于把窗体分成可拖动调整大小的两块区域。
一、SplitContainer 是什么
SplitContainer(分割容器)把一片区域分成两个面板(Panel1 和 Panel2),中间有一条可拖动调整大小的分隔条。最经典的用法是"左边列表 + 右边详情"。
基本信息
| 项目 | 内容 |
|---|---|
| 命名空间 | System.Windows.Forms |
| 继承关系 |
SplitContainer → ContainerControl → Control
|
| 在工具箱里的名字 | SplitContainer |
| 核心作用 | 分割成两块可调大小的区域 |
两个面板
SplitContainer 自带两个面板:
| 面板 | 位置 | 典型用途 |
|---|---|---|
Panel1 |
左边(或上边) | 放列表、树 |
Panel2 |
右边(或下边) | 放详情 |
最简单示例
// 创建分割容器
SplitContainer split = new SplitContainer();
split.Dock = DockStyle.Fill; // 填满窗体
// 往左面板放一个 ListBox
ListBox listBox = new ListBox();
listBox.Dock = DockStyle.Fill;
split.Panel1.Controls.Add(listBox);
// 往右面板放一个 TextBox
TextBox textBox = new TextBox();
textBox.Multiline = true;
textBox.Dock = DockStyle.Fill;
split.Panel2.Controls.Add(textBox);
// 添加到窗体
this.Controls.Add(split);
二、如何创建 SplitContainer
方式 1:设计器拖拽
从工具箱拖入 SplitContainer,把控件分别放进左右两个面板。
方式 2:代码创建
SplitContainer split = new SplitContainer();
split.Dock = DockStyle.Fill;
this.Controls.Add(split);
三、SplitContainer 的属性详解
3.1 面板相关
Panel1 / Panel2 —— 两个面板
// 往左面板加控件
splitContainer1.Panel1.Controls.Add(控件);
// 往右面板加控件
splitContainer1.Panel2.Controls.Add(控件);
Panel1MinSize / Panel2MinSize —— 面板最小宽度
splitContainer1.Panel1MinSize = 100; // 左面板最小 100
splitContainer1.Panel2MinSize = 100; // 右面板最小 100
3.2 布局类属性
Orientation —— 分割方向
| 值 | 说明 |
|---|---|
Vertical |
左右分割(默认) |
Horizontal |
上下分割 |
splitContainer1.Orientation = Orientation.Vertical; // 左右
splitContainer1.Orientation = Orientation.Horizontal; // 上下
SplitterDistance —— 分隔条位置
splitContainer1.SplitterDistance = 200; // 左面板宽度为 200
SplitterWidth —— 分隔条宽度
splitContainer1.SplitterWidth = 4; // 分隔条宽度
IsSplitterFixed —— 是否固定分隔条
splitContainer1.IsSplitterFixed = true; // 用户不能拖动分隔条
FixedPanel —— 固定哪个面板
splitContainer1.FixedPanel = FixedPanel.Panel1; // 左面板固定,右边随窗体变化
四、SplitContainer 的事件
SplitterMoved —— 分隔条拖动后
private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e)
{
// 用户拖动分隔条后触发
lblTip.Text = "左面板宽度:" + splitContainer1.SplitterDistance;
}
五、实用技巧
5.1 经典布局:左边列表 + 右边详情
public Form1()
{
InitializeComponent();
// 左面板放 ListView
ListView listView = new ListView();
listView.Dock = DockStyle.Fill;
listView.View = View.Details;
listView.FullRowSelect = true;
splitContainer1.Panel1.Controls.Add(listView);
// 右面板放 RichTextBox(显示详情)
RichTextBox rtb = new RichTextBox();
rtb.Dock = DockStyle.Fill;
rtb.ReadOnly = true;
splitContainer1.Panel2.Controls.Add(rtb);
// 设置面板最小宽度
splitContainer1.Panel1MinSize = 150;
splitContainer1.Panel2MinSize = 200;
}
5.2 上下分割(类似聊天窗口)
splitContainer1.Orientation = Orientation.Horizontal; // 上下分割
splitContainer1.SplitterDistance = 300; // 上部分高度 300
六、数据绑定与实体类示例
SplitContainer 是容器,本身不绑定数据,但常用来做"左边列表 + 右边详情"的联动。这一节演示:左边学生列表,右边显示选中学生详情。
6.1 什么是实体类(Model)
// 定义"学生"实体类
public class Student
{
public int Id { get; set; } // 学号
public string Name { get; set; } // 姓名
public int Age { get; set; } // 年龄
public string Sex { get; set; } // 性别
public string Remark { get; set; } // 备注
}
6.2 左右联动(列表选中 → 详情显示)
public partial class Form1 : Form
{
private List<Student> _students;
public Form1()
{
InitializeComponent();
// 配置左面板的 ListView
listView1.View = View.Details;
listView1.FullRowSelect = true;
listView1.Columns.Add("姓名", 100);
listView1.Columns.Add("年龄", 60);
}
private void Form1_Load(object sender, EventArgs e)
{
// 准备学生数据
_students = new List<Student>
{
new Student { Id = 1, Name = "张三", Age = 25, Sex = "男", Remark = "班长" },
new Student { Id = 2, Name = "李四", Age = 22, Sex = "女", Remark = "学习委员" },
new Student { Id = 3, Name = "王五", Age = 28, Sex = "男", Remark = "体育委员" },
};
// 填充左边列表
foreach (Student student in _students)
{
ListViewItem item = new ListViewItem(student.Name);
item.SubItems.Add(student.Age.ToString());
item.Tag = student; // 存对象
listView1.Items.Add(item);
}
}
// 选中左边列表项时,右边显示详情
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count == 0) return;
// 取出选中行关联的学生对象
Student student = (Student)listView1.SelectedItems[0].Tag;
// 在右面板显示详情($ 插值)
lblDetail.Text = $"学号:{student.Id}\n姓名:{student.Name}\n年龄:{student.Age}\n性别:{student.Sex}\n备注:{student.Remark}";
}
}
这是 SplitContainer 最经典的用法:左边列表 + 右边详情联动。
七、完整实战示例
做一个"学生管理"界面,左列表右详情:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 配置分割容器
splitContainer1.Panel1MinSize = 150;
splitContainer1.Panel2MinSize = 200;
// 配置左边 ListView
listView1.View = View.Details;
listView1.FullRowSelect = true;
listView1.Columns.Add("姓名", 100);
listView1.Columns.Add("年龄", 60);
}
private void Form1_Load(object sender, EventArgs e)
{
// 准备数据
List<Student> students = new List<Student>
{
new Student { Id = 1, Name = "张三", Age = 25, Sex = "男", Remark = "班长" },
new Student { Id = 2, Name = "李四", Age = 22, Sex = "女", Remark = "学习委员" },
};
// 填充列表
foreach (Student student in students)
{
ListViewItem item = new ListViewItem(student.Name);
item.SubItems.Add(student.Age.ToString());
item.Tag = student;
listView1.Items.Add(item);
}
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count == 0) return;
Student student = (Student)listView1.SelectedItems[0].Tag;
// 右面板显示详情
txtDetail.Text = $"姓名:{student.Name}\r\n年龄:{student.Age}\r\n性别:{student.Sex}\r\n备注:{student.Remark}";
}
}
// 学生实体类
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
public string Remark { get; set; }
}
八、常见问题
Q1:SplitContainer 是干什么的?
答:把窗体分成两个可拖动调整大小的面板,常用于"列表 + 详情"布局。
Q2:怎么往左右面板放控件?
答:splitContainer1.Panel1.Controls.Add(...) 和 Panel2.Controls.Add(...)。
Q3:怎么改成上下分割?
答:splitContainer1.Orientation = Orientation.Horizontal;
Q4:怎么禁止用户拖动分隔条?
答:splitContainer1.IsSplitterFixed = true;
Q5:怎么设置左右面板的初始大小?
答:splitContainer1.SplitterDistance = 200;(左面板宽度 200)。