WinForm 常用控件:TreeView 与 DateTimePicker
2022 年 9 月 23 日 · 2 分钟读完
记录几个常用但用起来稍复杂的控件。
TreeView(树状视图)

TreeView 用层级结构显示节点,就像资源管理器左边的文件夹树。最小单元是节点 TreeNode,有子节点的节点叫父节点。
创建节点
TreeNode 有好几个构造函数:
new TreeNode();
new TreeNode(string text);
new TreeNode(string text, TreeNode[] children);
new TreeNode(string text, int imageIndex, int selectedImageIndex);
new TreeNode(string text, int imageIndex, int selectedImageIndex, TreeNode[] children);
添加和移除
用 TreeView.Nodes 或 TreeNode.Nodes 的 Add:
var tn = new TreeNode("1班");
var tnn = new TreeNode("小明");
tn.Nodes.Add(tnn);
treeView1.Nodes.Add(tn);
移除有两种写法,效果一样:
tn.Nodes.Remove(tnn); // 从集合里移除
tnn.Remove(); // 节点把自己从树上移除

节点图标
节点文字左边可以显示图标,需要搭配一个 ImageList:
- 把 TreeView 的
ImageList属性设为一个 ImageList 控件; - 设置节点的
ImageIndex(普通状态)和SelectedImageIndex(选中状态)。
子节点不单独设置图标时,会用和 TreeView 默认值相同的图标,看起来像是继承了父节点。

private void Form1_Load(object sender, EventArgs e)
{
imageList1.Images.Add(Image.FromFile(@"D:\icons\class.png"));
imageList1.Images.Add(Image.FromFile(@"D:\icons\student.png"));
treeView1.ImageList = imageList1;
var tn = new TreeNode("1班") { ImageIndex = 0, SelectedImageIndex = 0 };
treeView1.Nodes.Add(tn);
var tnn = new TreeNode("小明") { ImageIndex = 1, SelectedImageIndex = 1 };
tn.Nodes.Add(tnn);
}

获取选中的节点
在 AfterSelect 事件里,e.Node 就是刚选中的节点:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
label1.Text = e.Node.Text;
}

用 TreeView 显示磁盘目录时,SelectedNode.FullPath 可以直接拿到从根到当前节点的路径,前提是把 PathSeparator 设为 \。
DateTimePicker(日期控件)

用来选择一个日期时间(不是一段时间),也可以直接输入。
显示格式 Format
| 值 | 说明 | 效果 |
|---|---|---|
| Long | 系统的长日期格式(默认) | ![]() |
| Short | 系统的短日期格式 | ![]() |
| Time | 系统的时间格式 | ![]() |
| Custom | 用 CustomFormat 自定义 |
见下 |
Format 设为 Custom 后,CustomFormat 才生效。格式字符:

dateTimePicker1.Format = DateTimePickerFormat.Custom;
dateTimePicker1.CustomFormat = "tt ss:mm:HH dd-MM-yyyy"; // 故意倒着显示

选择和取值
点右边的按钮打开日历:

选中的值保存在 Value 里,是 DateTime 类型:
private void button1_Click(object sender, EventArgs e)
{
label2.Text = dateTimePicker1.Value.ToString();
}

延伸
- TreeView 节点多时先暂停刷新:一次加几百上千个节点,用
treeView1.BeginUpdate(); ... treeView1.EndUpdate();包起来,否则每加一个都重绘,又慢又闪。节点特别多(比如整个磁盘)时,只加载第一层,在BeforeExpand事件里再加载子节点(懒加载)。 - 节点上挂数据:
TreeNode.Tag可以存任意对象,比如设备对象或 PLC 地址,选中时从e.Node.Tag取出来,不用靠文本去查。 - 按名字找节点:添加时设置
Name(tn.Nodes.Add("key", "显示文字")),之后用treeView1.Nodes.Find("key", true)递归查找。 - 只选日期、去掉时间部分:
dateTimePicker1.Value.Date。查询数据库里某一天的数据时,用>= d.Date && < d.Date.AddDays(1),比比较字符串可靠。 - 选时间段:放两个 DateTimePicker 做开始和结束,在
ValueChanged里互相设置MinDate/MaxDate,防止开始晚于结束。 - 只选时间:
Format = Time再加ShowUpDown = true,变成上下箭头调整,不弹日历。 - 允许不选:
ShowCheckBox = true后左边多一个勾选框,Checked为 false 表示用户没选日期。
原文首发于 blog.csdn.net


