← 全部文章 WinForm

WinForm 常用控件:TreeView 与 DateTimePicker

2022 年 9 月 23 日 · 2 分钟读完

目录
  1. TreeView(树状视图)
  2. 创建节点
  3. 添加和移除
  4. 节点图标
  5. 获取选中的节点
  6. DateTimePicker(日期控件)
  7. 显示格式 Format
  8. 选择和取值
  9. 延伸

记录几个常用但用起来稍复杂的控件。

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:

  1. 把 TreeView 的 ImageList 属性设为一个 ImageList 控件;
  2. 设置节点的 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 表示用户没选日期。

# WinForm # 控件

原文首发于 blog.csdn.net