所以我想做的是: 我有5个主要复选框,每个复选框有3个子复选框。 选择一些框后,我试图选择所选框的随机项,然后在文本框中显示。
我的第一个问题是TreeView的方法是什么?这似乎是实现分层视图的最佳方式。
第二个问题是选择随机项我需要先将项插入列表/数组吗?
编辑:
好的,所以我的代码到目前为止是这样的:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace TreeSelector
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
treeView1.CheckBoxes = true;
//TreeView
treeView1.Nodes.Add("Main0");
treeView1.Nodes[0].Nodes.Add("Child1");
treeView1.Nodes[0].Nodes.Add("Child2");
treeView1.Nodes[0].Nodes.Add("Child3");
treeView1.Nodes.Add("Main1");
treeView1.Nodes[1].Nodes.Add("Child1");
treeView1.Nodes[1].Nodes.Add("Child2");
treeView1.Nodes[1].Nodes.Add("Child3");
treeView1.Nodes.Add("Main2");
treeView1.Nodes[2].Nodes.Add("Child1");
treeView1.Nodes[2].Nodes.Add("Child2");
treeView1.Nodes[2].Nodes.Add("Child3");
treeView1.Nodes.Add("Main3");
treeView1.Nodes[3].Nodes.Add("Child1");
treeView1.Nodes[3].Nodes.Add("Child2");
treeView1.Nodes[3].Nodes.Add("Child3");
treeView1.Nodes.Add("Main4");
treeView1.Nodes[4].Nodes.Add("Child1");
treeView1.Nodes[4].Nodes.Add("Child2");
treeView1.Nodes[4].Nodes.Add("Child3");
//TreeView setting
treeView1.Location = new Point(0, 25);
treeView1.Size = new Size(160, 350);
this.ClientSize = new Size(300, 400);
}
private void button1_Click_1(object sender, EventArgs e)
{
var checkboxes = Control.AllControls<CheckBox>();
}
}
static class ExtensionHelpers
{
public static IEnumerable<T> AllControls<T>(this Control startingPoint) where T : Control
{
bool hit = startingPoint is T;
if (hit)
{
yield return startingPoint as T;
}
foreach (var child in startingPoint.Controls.Cast<Control>())
{
foreach (var item in AllControls<T>(child))
{
yield return item;
}
}
}
}
}
我现在要做的是将Chris S链接的How can I iterate through all checkboxes on a form?应用到我的代码中。它给出的错误是&#39; Control&#39;不包含&#39; AllControls&#39;的定义在button1_Click_1上。 AllControls部分也不像IEnumerable那样在代码中高亮显示。
关于将所选框添加到列表中我在这里缺少什么?
它可能很简单。我应该提到我不是一个好的程序员而且我正在尝试练习。如果您需要更多信息,请告诉我,我会尽力提供。
答案 0 :(得分:0)
我会这样走
您的5个主要复选框:
IEnumerable<ChildItem> CheckBox1Items;
IEnumerable<ChildItem> CheckBox2Items;
IEnumerable<ChildItem> CheckBox3Items;
IEnumerable<ChildItem> CheckBox4Items;
IEnumerable<ChildItem> CheckBox5Items;
选择后,将这些项目添加到列表中。我们假设用户选择了1,3,5
var list = new List<ChildItem>();
list.AddRange(CheckBox1Items);
list.AddRange(CheckBox3Items);
list.AddRange(CheckBox5Items);
然后选择一个随机项目:
Random selector = new Random();
int index = selector .Next(list.Count);
Console.WriteLine(list[index]); // Here is your random item
关于使用什么的问题:我会说TreeView with CheckBoxes是最好的。您可以使用可枚举项轻松填充树节点。
答案 1 :(得分:0)
1)我无法回答1。
2)至于两个,我可能会在InitializeComponent()之后保留一个在构造函数中初始化的所有复选框的列表。如果动态生成复选框,则可以推迟初始化。然后你生成一个介于1和Count-1之间的随机数,这是你的随机复选框。
3)要轻松填充复选框列表,请参阅以下答案:https://stackoverflow.com/a/1788757/5481748。它允许控件可以嵌套。