2012-03-22 2 views
1

Просто изучать C#, радиокнопки и флажки. Нет срочности. Код работает, чтобы отображать имена проверенных элементов управления, но, похоже, это не элегантное решение.лучшее решение для gui-кода?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace TVC 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      label1.Text = "you clicked" + compute(); 
     } 


     string compute() 
     { 
      string result = ""; 
      object o=label1; 

      while (((Control)o).TabIndex!=7) 
      { 
       if ((o is RadioButton)||(o is CheckBox)) 
       { 

        if ((o is RadioButton)&&((RadioButton)o).Checked) 

        result += " "+((RadioButton)o).Text; 

        if ((o is CheckBox)&&((CheckBox)o).Checked) 

        result += " "+((CheckBox)o).Text; 

       } 

       o = GetNextControl((Control)o, true); 
      } 



      return result; 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

В checboxes и Radiobuttons tabindexes отсчитываются от 1to 6, метка 0 и кнопка 7, так что GetNextControl работает. Есть ли более хороший код, который бы работал? enter image description here

+3

Независимо от того, что вы делаете, всегда избегайте магических чисел. Даже если это конечный код, с которым вы работаете, извлеките это '7' в отдельную константу. – rid

+0

+1 Для хорошего предложения по магическим номерам –

ответ

1

Я только что проверил это и проверил, что он работает. Он использует рекурсию и новое ключевое слово dynamic, поскольку оказывается, что RadioButton и CheckBox наследуют от ButtonBase, у которого нет свойства Checked, иначе вы могли бы свалить на это. Динамика позволяет мне избежать этого, поскольку я уже знаю типы управления.

private void button1_Click(object sender, EventArgs e) 
    { 
     label1.Text = compute(this.Controls); 
    } 
    private string compute(Control.ControlCollection controls) 
    { 
     string result = String.Empty; 
     foreach (Control control in controls) 
     { 
      if (control.Controls != null) 
       result += compute(control.Controls); 
      if (control is RadioButton || control is CheckBox) 
      { 
       dynamic checkControl = control; 
       if (checkControl.Checked) 
       { 
        result += checkControl.Text + ";"; 
       } 
      } 
     } 
     return result; 
    } 
+0

спасибо, я не знал о ControlCollection или динамическом – steelponey

1

Если вы нашли себя с помощью is и as ключевого слова для управления ветвлением, есть большой шанс, что вы не используя polymorphism.

Если вы хотите иметь элементы управления, которые могут отображать собственное состояние на основе логики вашей программы, одним из подходов к уборке является подкласс каждого элемента управления и переопределение ToString().

Поместите логику для создания текстового представления в элементе управления, а не в коде, который использует ряд элементов управления (как комплекс будет ваша ветвление логика получить, если добавить 10 новых типов элементов управления?)

Наконец, я бы используйте foreach, а не while с жестко запрограммированным номером, чтобы перебирать элементы управления.

Смежные вопросы