Зависимость textbox от combobox

96
18 августа 2019, 14:20

Необходимо реализовать программу Которая рассчитывает например окружность, трапецию и параболу... необходимо в интерфейсе программы реализовать что бы в зависимости от того что выбрано в combobox рассчитывалось по разным формулам подскажите как это можно реализовать?

Answer 1

Идея реализации довольно проста. На гл.окне размещаем ComboBox и Panel. Создаем коллекцию нужных фигур, в комбобоксе отображаем названия фигур. После того как сделан выбор той или иной фигуры, отображаем в панеле связанную с этой фигурой UserContorl. Вычисление площади происходит в классе фигуры.

Создадим класс абстрактн.фигуры

public abstract class Figure
{
    //ctor
    public Figure(string figureName, UserControl userControl)
    {
        if (String.IsNullOrEmpty(figureName)) throw new ArgumentException(nameof(figureName));
        if (userControl == null) throw new ArgumentNullException(nameof(userControl));
        Name = figureName;
        Control = userControl;
    }
    public string Name { get; private set; }
    public UserControl Control { get; private set; }
    public double Area => GetArea();
    protected virtual double GetArea()
    {
        return 0;
    }
}

А теперь класс Окружности

public class Circle : Figure
{
    public Circle(string figureName, UserControl userControl,
                  double diameter) : base(figureName, userControl)
    {
        if (diameter <= 0) throw new ArgumentException($"Неверное значение для {nameof(diameter)}");
        Diameter = diameter;
        //даем ссылку вьюшке
        (Control as CircleView).Circle = this;
    }
    private double _Diameter;
    public double Diameter
    {
        get => _Diameter;
        set
        {
            _Diameter = value;
            _Radius = _Diameter / 2;
        }
    }
    private double _Radius;
    public double Radius
    {
        get => _Radius;
        set
        {
            _Radius = value;
            _Diameter = _Radius * 2;
        }
    }
    protected override double GetArea()
    {
        return Math.PI * Math.Pow(Radius, 2);
    }
}

классы "пустой фигуры" и "трапеции" я показывать не буду, но их вы можете написать сами. Вот кодбихайнд UserControl для окружности

public partial class CircleView : UserControl
{
    //источник привязок
    private BindingSource _bs = new BindingSource();
    public CircleView()
    {
        InitializeComponent();
        //установка привязок
        SetBindings();
    }
    private void SetBindings()
    {
        //тип данных
        _bs.DataSource = typeof(Circle);
        //привязка для текстбокса Радиуса
        var radiusBinding = new Binding("Text", _bs, nameof(Circle.Radius),
            true, DataSourceUpdateMode.OnPropertyChanged);
        _textBoxRadius.DataBindings.Add(radiusBinding);
        //привязка для текстбокса Диаметра
        var diameterBinding = new Binding("Text", _bs, nameof(Circle.Diameter),
            true, DataSourceUpdateMode.OnPropertyChanged);
        _textBoxDiameter.DataBindings.Add(diameterBinding);
        //привязка для вывода площади фигуры
        var labelBinding = new Binding("Text", _bs, nameof(Circle.Area),
            true, DataSourceUpdateMode.OnPropertyChanged, 0, "f4");
        _labelArea.DataBindings.Add(labelBinding);
    }
    /// <summary>
    /// Рабочая окружность
    /// </summary>
    public Circle Circle
    {
        get => _bs.Current as Circle;
        set
        {
            _bs.Clear();
            _bs.Add(value);
        }
    }
}

А вот кодбихайнд гл.окна (формы)

public partial class MainForm : Form
{
    //источник данных (коллекции фигур)
    private Context _context = new Context();
    //источник привязок
    private BindingSource _bsFigures = new BindingSource();
    public MainForm()
    {
        InitializeComponent();
        //установка привязок
        SetBindings();
        //загрузка данных
        LoadData();
        //настройка окна
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Text = "Пример";
    }
    private void SetBindings()
    {
        //устанавливаем тип источника данных
        _bsFigures.DataSource = typeof(List<Figure>);
        //подписываемся на изменение текущей выбранной фигуры
        _bsFigures.CurrentChanged += BsFigures_CurrentChanged;
        //делаем привязку для комбобокса
        _comboBoxFigures.DataSource = _bsFigures;
        //комбобокс будет отображать названия фигур из коллекции
        _comboBoxFigures.DisplayMember = nameof(Figure.Name);
    }
    private void BsFigures_CurrentChanged(object sender, EventArgs e)
    {
        //подготовка панели
        _panelOutput.Controls.Clear();
        //отображение UserControl связанной с соотв.фигурой
        _panelOutput.Controls.Add((_bsFigures.Current as Figure).Control);
    }
    private void LoadData()
    {
        _bsFigures.DataSource = _context.GetFigures();
    }
}

Класс создающий коллекцию фигур такой

public class Context
{
    private List<Figure> _figures;
    //ctor
    public Context()
    {
        _figures = new List<Figure>
        {
            new EmptyFigure("Какая?", new EmptyFigureView()),
            new Circle("Окружность", new CircleView(), 1),
            new Trapezium("Трапеция", new TrapeziumView(), 1, 2, 1)
        };
    }
    public List<Figure> GetFigures()
    {
        return _figures;
    }
}
READ ALSO
&ldquo;общение&rdquo; со строкой таблицы [дубликат]

“общение” со строкой таблицы [дубликат]

На данный вопрос уже ответили:

108
Как распечатать результат JS на странице?

Как распечатать результат JS на странице?

Нашел отличный js который конвертирует XML в JSON на лету

149
Где лучше размещать php файлы?

Где лучше размещать php файлы?

Где лучше размещать php-скрипты и фалы к которым доступ должен не предоставляются по http? Вне корневого каталога веб-сайта? Или лучше их помещать...

125