如何从所选复选框

时间:2015-11-19 20:22:50

标签: c# winforms checkbox

所以我想做的是: 我有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那样在代码中高亮显示。

关于将所选框添加到列表中我在这里缺少什么?

它可能很简单。我应该提到我不是一个好的程序员而且我正在尝试练习。如果您需要更多信息,请告诉我,我会尽力提供。

2 个答案:

答案 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。它允许控件可以嵌套。