【问题标题】:Treeview of Checkbox复选框的树状视图
【发布时间】:2014-05-14 01:00:06
【问题描述】:

我创建了一个用户控件,其中包含一个checkbox 控件和一个字符串,该字符串包含我想为每个checkbox 保存的另一个值。

用户可以选择或取消选择复选框。

public partial class UserControl1 : UserControl
{
    private CheckBox c = new CheckBox();
    private string EAType;
}

但是,它们有很多,Form layout 看起来很乱。
因此,我想按标准对它们进行分类,将它们组织在treeview 中。

这很容易将treeview 设置为checkbox-treeview,但是,如前所述,我要为每个字符串存储另一个字符串。

usercontrol treeview 可能吗?如果是,怎么做?
欢迎任何其他想法...

【问题讨论】:

    标签: c# winforms checkbox user-controls treeview


    【解决方案1】:

    您是否需要UserControl 来存储字符串?

    要将自定义信息添加到Control,您始终拥有Tag 属性,而要将自定义信息添加到TreeNode,您拥有TreeNode.Tag 属性(您可以存储您想要的内容、类或直接您的字符串)。

    foreach (var obj in objects)
        treeView.Nodes.Add(new TreeNode { Text = obj.Title, Tag = obj.Value });
    

    在此示例中,我有一个假设集合 objectsTitle 属性将确定 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-27
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      相关资源
      最近更新 更多