- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我知道如何为 TreeView 中的每个 TreeNode 显示一个复选框。我想在 TreeView 中为每个 TreeNode 显示 3 个复选框。这样做的原因是我的程序中有3个图表,每个TreeNode代表一个不同的系列。我想让用户选择在他们喜欢的任何图表上显示每个系列。
这(或类似的东西)可能吗?提前致谢。
最佳答案
您需要自己绘制一个TreeView
。不完全是所有者绘制控件的最简单示例,但仍然不太难。
这是一个示例截图:
首先我们创建简单的 TreeNode
子类来保存额外的数据:
public class TreeNode3 : TreeNode
{
public string Label { get; set; }
public bool Check1 { get; set; }
public bool Check2 { get; set; }
public bool Check3 { get; set; }
public new string Text
{
get { return Label; }
set { Label = value; base.Text = ""; }
}
public TreeNode3() { }
public TreeNode3(string text) { Label = text; }
public TreeNode3(string text, bool check1, bool check2, bool check3)
{
Label = text;
Check1 = check1; Check2 = check2; Check3 = check3;
}
public TreeNode3(string text, TreeNode3[] children)
{
Label = text;
foreach (TreeNode3 node in children) this.Nodes.Add(node);
}
}
注意,我隐藏了原来的Text,基本上用字符串变量Label代替了。我避免使用 Tag
所以你仍然可以自己使用它。我没有实现所有的构造函数。如果您需要 ImageLists
,您可能希望使用 ImageIndices
添加它们。
现在是 TreeView
本身:
using System.Windows.Forms.VisualStyles;
//..
public partial class UcTreeView : TreeView
{
[DisplayName("Checkbox Spacing"), CategoryAttribute("Appearance"),
Description("Number of pixels between the checkboxes.")]
public int Spacing { get; set; }
[DisplayName("Text Padding"), CategoryAttribute("Appearance"),
Description("Left padding of text.")]
public int LeftPadding { get; set; }
public UcTreeView()
{
InitializeComponent();
DrawMode = TreeViewDrawMode.OwnerDrawText;
HideSelection = false; // I like that better
CheckBoxes = false; // necessary!
FullRowSelect = false; // necessary!
Spacing = 4; // default checkbox spacing
LeftPadding = 7; // default text padding
}
public TreeNode3 AddNode(string label, bool check1, bool check2, bool check3)
{
TreeNode3 node = new TreeNode3(label, check1, check2, check3);
this.Nodes.Add(node);
return node;
}
private Size glyph = Size.Empty;
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
TreeNode3 n = e.Node as TreeNode3;
if (n == null) { e.DrawDefault = true; return; }
CheckBoxState cbsTrue = CheckBoxState.CheckedNormal;
CheckBoxState cbsFalse = CheckBoxState.UncheckedNormal;
Rectangle rect = new Rectangle(e.Bounds.Location,
new Size(ClientSize.Width, e.Bounds.Height));
glyph = CheckBoxRenderer.GetGlyphSize(e.Graphics, cbsTrue );
int offset = glyph.Width * 3 + Spacing * 2 + LeftPadding;
if (n.IsSelected)
{
e.Graphics.FillRectangle(SystemBrushes.MenuHighlight ,rect);
e.Graphics.DrawString(n.Label, Font, Brushes.White,
e.Bounds.X + offset, e.Bounds.Y);
}
else
{
CheckBoxRenderer.DrawParentBackground(e.Graphics, e.Bounds, this);
e.Graphics.DrawString(n.Label, Font, Brushes.Black,
e.Bounds.X + offset, e.Bounds.Y);
}
CheckBoxState bs1 = n.Check1 ? cbsTrue : cbsFalse;
CheckBoxState bs2 = n.Check2 ? cbsTrue : cbsFalse;
CheckBoxState bs3 = n.Check3 ? cbsTrue : cbsFalse;
CheckBoxRenderer.DrawCheckBox(e.Graphics, cbx(e.Bounds, 0).Location, bs1);
CheckBoxRenderer.DrawCheckBox(e.Graphics, cbx(e.Bounds, 1).Location, bs2);
CheckBoxRenderer.DrawCheckBox(e.Graphics, cbx(e.Bounds, 2).Location, bs3);
}
protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e)
{
Console.WriteLine(e.Location + " bounds:" + e.Node.Bounds);
TreeNode3 n = e.Node as TreeNode3;
if (e == null) return;
if (cbx(n.Bounds, 0).Contains(e.Location)) n.Check1 = !n.Check1;
else if (cbx(n.Bounds, 1).Contains(e.Location)) n.Check2 = !n.Check2;
else if (cbx(n.Bounds, 2).Contains(e.Location)) n.Check3 = !n.Check3;
else
{
if (SelectedNode == n && Control.ModifierKeys == Keys.Control)
SelectedNode = SelectedNode != null ? null : n;
else SelectedNode = n;
}
Console.WriteLine(" " + n.Check1 + " " + n.Check2 +" " + n.Check3 );
Invalidate();
}
Rectangle cbx(Rectangle bounds, int check)
{
return new Rectangle(bounds.Left + 2 + (glyph.Width + Spacing) * check,
bounds.Y + 2, glyph.Width, glyph.Height);
}
}
一些注意事项:
LabelEditing
。可行,但又是一堆蠕虫..FullrowSelect
为真,但实际上它仍然有效..ImageList
和 StateImageList
但需要在添加节点后设置索引。CheckBoxes
属性设置为 true!所有三个 CheckBoxes
都是虚拟的,您可以在将节点转换为 TreeNode3
作为其 Check1..Check3
属性后访问它们!Console.WriteLines
以便更好地测试..更新 我添加了 Spacing
和 Padding
属性以及一些构造函数。现在设置示例的表单代码看起来很正常:
ucTreeView1.Nodes.Add(new TreeNode3("Bauhaus", true, true, false));
TreeNode3 aNode = ucTreeView1.AddNode("Beatles", true, true, false);
ucTreeView1.Nodes.Add(new TreeNode3("Blur", true, true, false));
ucTreeView1.Nodes.Add(new TreeNode3("Byrds", true, true, false));
ucTreeView1.Nodes.Add(new TreeNode3("Bee Gees", new TreeNode3[]{
new TreeNode3("Barry", true, false, false),
new TreeNode3("Robin"),
new TreeNode3("Maurice")} ));
TreeNode3 aNodeA = new TreeNode3("John", true, true, false);
TreeNode3 aNodeB = new TreeNode3("Paul", true, true, true);
TreeNode3 aNodeC = new TreeNode3("George", true, false, true);
TreeNode3 aNodeD = new TreeNode3("Ringo", true, false, false);
aNode.Nodes.Add(aNodeA);
aNode.Nodes.Add(aNodeB);
aNode.Nodes.Add(aNodeC);
aNode.Nodes.Add(aNodeD);
关于c# - 如何在 C# 的 TreeView 中显示多个复选框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28644011/
我在一页上有两个 Kendo UI TreeViews。例如: var data1 = new kendo.data.HierarchicalDataSource({ data: [
使用 Vuetify 的 TreeView 组件时,我试图能够选择父级 没有 让它也选择所有的后代( child )。我尝试了可选、可激活等的各种组合……但似乎找不到合适的组合。 任何人都有实现这一预
在我的应用程序中,左侧有一个 TreeView,我根据 TreeView 中的选择更新右侧的 Pane 。一个非常直接的场景。当选择为空时,我会在 Pane 中显示一条类似“请进行选择”的消息,即我还
我有一个我自己无法解决的问题。请帮忙。 我有(有条件地): /** @mainpage A @subpage B */ /** @page B @subpage C */ /** @page C */
我制作了一个高度为 40 px 的自定义树单元。 这里的问题披露三角形没有垂直居中对齐。 这里是树单元的代码: public static class TestObjectCell extends A
我正在学习如何使用 kotlin 并已开始使用tornadoFX。我正在阅读该指南以尝试学习它,但是我无法弄清楚“具有不同类型的 TreeView”中的含义。似乎是说我应该使用星形投影,据我所知,当您
如何在 JavaFX 2 TreeView 中过滤节点? 我有一个 TextField,我想根据 TextField 的内容过滤所有节点(例如节点标签)。 谢谢。 最佳答案 这是我编写的可重用的可过滤
我正在通过查询 sharepoint 用户配置文件构建一个 asp.net TreeView 。要选择的帐户名和根节点帐户名正在从查询字符串中读取。 我还需要为树配置可配置的扩展深度。 如果节点属于第
我使用的是 JavaFX 8,目前正在进行一些 GUI 开发。我的 TreeView 有点问题,我需要你的帮助。 您知道在 TreeView 中是否可以只选择标签而不是 TreeCell 的整个宽度吗
我有很多(分层的)数据显示在 TreeView 中(可能是大约 20K 项或更多,包括子项)。我的数据的特殊问题是 TreeView 中显示的每个对象都可以存在于许多 TreeView 项目中。我的意
有没有什么简单的方法可以让 Gtk.Treeview 在编辑时更新它的列? 我基于 Gtk.ListStore 模型构建了 Treeview。我这样初始化单元格: Gtk.CellRendererTe
我开始使用 javafx。我有一个问题。我有一个树 View ,其中节点通过外部命令改变了他的位置,但它只是看不到树。我必须最小化父级并重新展开才能看到效果。 Altem 对该树 View 的任何建议
如何在 Kendo Treeview 中取消选择节点? 我尝试从节点中删除类“k-state-selected”。它工作正常,但有没有直接的方法可以做到这一点。 最佳答案 现在有一种更好的方法可以取消
我有以下情况,我有一个带有许多嵌套子节点的父节点。只有父节点应该有一个复选框,我发现的唯一例子是只有子节点有一个复选框。这可以使用 Kendo 模板吗? http://dojo.telerik.com
我正在尝试向 TreeView 数据项添加一些内联图标,但是 k-template 指令似乎没有呈现任何内容。 我基于在线文档在 http://demos.telerik.com/k
我有一个带有复选框和父节点和子节点的 Kendo Treeview 。 我需要将选中节点的完整层次结构复制到另一个 Treeview 中。 ex - 根节点、父节点和选中的子节点。 下面是我的代码,但
我需要在较大的滚动 Pane 中使用 JavaFX 2.2 TreeView 控件,该滚动 Pane 具有多个不属于 Treeview 的其他元素。问题是 TreeView 有它自己的内置滚动 Pan
当我通过单击 TreeView 节点右侧的加号来展开该节点时,该节点将被选中。我怎样才能避免这种情况?我希望能够在不更改所选节点的情况下展开节点(例如在 RegEdit.exe 中),并且仅在单击节点
我正在尝试设置一个 Treeview 对象,设置节点,然后更新控件以使值具有适当的格式。现在我有以下代码,当我设置一个控件时,它可以工作,但不是来自变量的控件。如何从变量设置本地控件? Private
如何将节点填充到作为另一个 treeview1 实例的 newtreeview1 中?添加到“newtreeview1”的节点应该在 treeview1 的第一个实例中可用? 例如;如果 treevi
我是一名优秀的程序员,十分优秀!