您是否需要UserControl 来存储字符串?
要将自定义信息添加到Control,您始终拥有Tag 属性,而要将自定义信息添加到TreeNode,您拥有TreeNode.Tag 属性(您可以存储您想要的内容、类或直接您的字符串)。
foreach (var obj in objects)
treeView.Nodes.Add(new TreeNode { Text = obj.Title, Tag = obj.Value });
在此示例中,我有一个假设集合 objects,Title 属性将确定 TreeNode 标题,并且我将另一个自定义值(来自 Value 属性)存储到 TreeNode.Tag 属性中。如果你愿意,你可以直接存储对象本身:
foreach (var obj in objects)
treeView.Nodes.Add(new TreeNode { Text = obj.Title, Tag = obj });
要访问它们,您需要转换为正确的类型,例如(使用字符串):
var checkedNodes = treeView.Nodes.Cast<TreeNode>().Where(x => x.Checked);
var selectedValues = checkedNodes.Select(x => Convert.ToString(x.Tag));
或者,使用对象:
var selectedValues = treeView.Nodes
.Cast<TreeNode>()
.Where(x => x.Checked)
.Select(x => (YourObject)x.Tag);
最后请注意,您甚至可以使用其他列表类型:
- 对于简单的值列表,您可以使用带有复选框的
ListBox。每个项目都是一个object,然后它可以是您想要的任何内容,只需覆盖ToString() 以提供正确的显示文本。
- 对于更复杂的列表(或者您想要分组组织更多项目),您可以使用
ListView。我们在TreeView 中看到的技术相同,每个ListViewItem 都有一个Tag 属性,您可以使用它来存储附加信息。如果您只需要一个级别(包含一组项目的多个组),它可能比树视图更方便,因为自定义更容易。
无论您选择或不选择哪个列表,您都可以使用简单的CheckBox,您实际上并不需要UserControl,在每个控件中,您都有一个Tag 属性用于此目的和更复杂的您可以直接从正确的控制(例如CheckBox)派生并添加您需要的属性/方法。 UserControl(通常)用于组合,当您需要一个由多个控件组成的控件时,例如重用一些复杂的 UI。