2015-11-19 98 views
-1

所以我想要做的是: 我有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; 
       } 
      } 

     } 
    } 
} 

什麼我現在想要做的是應用How can I iterate through all checkboxes on a form?由克里斯·s鏈接,我的代碼。它給出的錯誤是'Control'不包含button1_Click_1上'AllControls'的定義。 AllControls部分在IEnumerable之類的代碼中也不是高調的。

關於將選定框添加到列表我在這裏丟失了什麼?

它可以說是簡單的東西。我應該提到我不是一個好的程序員,我正在努力練習。如果你需要更多的信息告訴我,我會盡力提供。

+0

是的。做一個列表並選擇一個隨機索引。這是最簡單的方法。 –

+0

關於你的第一個問題,「TreeView」是爲什麼去做的?這取決於你,我們不知道你的應用程序是什麼樣的,或者它的功能是什麼。 「最佳」控件根據應用程序的使用方式而有所不同。至於第二個問題,給控件的'Tag'屬性指定一個數字,使用'Random.Next(1,16)'隨機選取一個,然後遍歷你的控件找到相應的'Tag'值。 – sab669

回答

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最好做。您可以使用可枚舉項目輕鬆填充樹節點。

0

1)我不能回答1.

2)兩個,我可能會記住這是在構造函數中的InitializeComponent後立即初始化所有的複選框的列表()。如果複選框是動態生成的,您可以推遲初始化。然後你生成一個介於1和1之間的隨機數,這是你的隨機複選框。

3)要方便地填寫複選框列表,請參閱此答案:https://stackoverflow.com/a/1788757/5481748。它允許控件可以嵌套的事實。