2014-01-15 178 views
0

我有4个标签,4个答案。其中一个是正确的。当我按下按钮时,我想要隐藏2个答案。所以,我有:删除标签foreach

string[] possible_answers = { "A", "B", "C", "D" }; 
string correct_answer= keyletter; 
string[] wrong_answers= posibile_variante.Where(val => val != correct_answer).ToArray(); 

和标签

label_0 
label_2 
label_1 
label_3 

假设

label_0 = A 
label_1 = B 
label_2 = C 
label_3 = D 

如何隐藏2个回答错标签?

+1

我的结果没有显示'4 - 1 = 2' – Jonesopolis

+0

@Jonesy你的计算器必须打破然后。试试另一个。 – Servy

+0

为什么要4 - 1 = 2?我需要隐藏3个错误中的2个答案,难以理解的是什么? – user2985344

回答

0

与您的标签字典一样

var labels = Dictionary<string, Label> { { "A", label_0 }, { "B", label_1 }, ... }; 

然后点击一个按钮,你说

foreach (var wa in wrong_answers) 
    labels[wa].Visible = false; 

也许这不是完全像你需要它,但你可以从它那里得到一个想法。

+0

你用字典的想法是完美的。谢谢。还有一个问题,请问除去3个错误答案中的2个的最佳方法是什么?我递增了一个i并验证if(i <2)标签[wa] .Visible = false; – user2985344

+0

有很多方法可以做到这一点。例如'。凡(VAL => VAL = correct_answer!)。取(2).ToArray();'然后循环将仅去除前两个错误的答案。如果你想随机选择,你必须以另一种方式来做。 –

0

把一个过于复杂的例子放在一起,假设您可能想要更改给定问题的可能答案的数量。它根据possible_answers(ResetLabels())中元素的数量动态设置屏幕上的标签数量,然后随机选择N个(#显示的项目 - 保留显示的数字)编号为错误要从屏幕上移除的答案RemoveWrongLabels 。 @Ondrej推荐使用Take(2),但是静态选择列表中的前2个元素(例如,用户知道总是知道来自剩余项目的正确答案)。 MSDN:Returns a specified number of contiguous elements from the start of a sequence.

string[] possible_answers = { "A", "B", "C", "D" }; 
    private void button2_Click(object sender, EventArgs e) 
    { 
     ResetLabels(); 

    } 
    private void ResetLabels() 
    { 
     for (int i = 0; i < this.labelContainer.Controls.Count - 1; i++) 
     { 
      this.labelContainer.Controls[i].Dispose(); 
     } 
     this.labelContainer.Controls.Clear(); 
     for (int i = possible_answers.Count() - 1; i >= 0; i--) 
     { 
      Label l = new Label(); 
      l.Text = possible_answers[i]; 
      l.Dock = DockStyle.Top; 
      this.labelContainer.Controls.Add(l); 
     } 
    } 
    private void button3_Click(object sender, EventArgs e) 
    { 
     RemoveWrongLabels(3, 2); 
    } 
    private void RemoveWrongLabels(int RightAnswer, int ItemsToDisplay) 
    { 

     Random rand = new Random(); 
     List<int> AnswersToHide = new List<int>(); 
     while (AnswersToHide.Count < labelContainer.Controls.Count - ItemsToDisplay) 
     { 
      int indexToHide = rand.Next(0, labelContainer.Controls.Count); 
      if (!AnswersToHide.Contains(indexToHide) && labelContainer.Controls[indexToHide].Text != possible_answers[RightAnswer]) 
      { 
       AnswersToHide.Add(indexToHide); 
      } 
     } 


     foreach (var item in AnswersToHide) 
     { 
      this.labelContainer.Controls[item].Visible = false; 


     } 
    } 
+0

哇,很好的例子,我会在几个小时内尝试。谢谢 – user2985344