SplitContainer(分割容器)控件详解

SplitContainer(分割容器)控件详解

本文面向零基础小白,所有代码都带详细注释。SplitContainer 用于把窗体分成可拖动调整大小的两块区域。


一、SplitContainer 是什么

SplitContainer(分割容器)把一片区域分成两个面板(Panel1 和 Panel2),中间有一条可拖动调整大小的分隔条。最经典的用法是"左边列表 + 右边详情"。

基本信息

项目 内容
命名空间 System.Windows.Forms
继承关系 SplitContainerContainerControlControl
在工具箱里的名字 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)。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容