лучшее решение для графического интерфейса? - PullRequest
1 голос
/ 22 марта 2012

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

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 отсчитываются от 1 до 6, метка 0 и кнопка 7, так что GetNextControl работает. Есть ли лучший код, который будет работать? enter image description here

Ответы [ 2 ]

1 голос
/ 22 марта 2012

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

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

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

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

1 голос
/ 22 марта 2012

Я только что проверил это и убедился, что оно работает.Он использует рекурсию и новое ключевое слово 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;
    }
...