-1

Есть две формы на одной из них есть textbox и combo box на против combo box есть кнопка добавить. Кликнув на данную кнопку открывается вторая форма куда вводятся данные. После сохранения закрывается вторая форма а на первой форме в combo box появляется введенное значение во второй форме. Как это можно реализовать?

Bulson
  • 9,411

1 Answers1

0

Можно так, используя привязки и валидацию ввода

пример работы

Создадим такой класс для элемента ComboBox

public class ComboItem
{
    public int Id { get; set; }
    public string Title { get; set; }
}

Форма создания нового элемента для ComboBox

public partial class AddForm : Form
{
    public ComboItem Item { get; }

    public AddForm(ComboItem comboItem)
    {
        InitializeComponent();

        Item = comboItem ??
            throw new ArgumentNullException(nameof(comboItem));

        //привязка
        _textBoxInput.DataBindings.Add("Text", Item,
            nameof(ComboItem.Title), true, DataSourceUpdateMode.OnValidation);
        //проверка вводимых данных
        _textBoxInput.Validating += TextBoxInput_Validating;

        //кнопка
        _buttonAdd.DialogResult = DialogResult.OK;
    }

    //проверяем вводимые данные
    private void TextBoxInput_Validating(object sender, CancelEventArgs e)
    {
        var input = _textBoxInput.Text.Trim();
        //если пользователь ввел пустой текст
        //или текст содержит цифры
        if (String.IsNullOrWhiteSpace(input)
            || input.AsEnumerable<char>().Any(c => char.IsDigit(c)))
        {
            //отменяем ввод
            e.Cancel = true;
        }
    }
}

Основная форма

public partial class MainForm : Form
{
    //источник данных для комбобокса и текстбоксов
    private readonly BindingSource _bsCombo;

    public MainForm()
    {
        InitializeComponent();

        //настраиваем источник
        _bsCombo = new BindingSource();
        _bsCombo.DataSource = typeof(IList<ComboItem>);
        //привязки ComboBox
        _comboBox.DataSource = _bsCombo;
        _comboBox.DisplayMember = nameof(ComboItem.Title);
        //привязки TextBoxов
        _textBoxTitle.DataBindings.Add("Text", _bsCombo, nameof(ComboItem.Title));
        _textBoxId.DataBindings.Add("Text", _bsCombo, nameof(ComboItem.Id));

        //кнопка
        _buttonAdd.Click += ButtonAdd_Click;
        //
        this.Load += MainForm_Load;
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
        //добавляем первый элемент в комбобокс
        _bsCombo.Add(new ComboItem { Id = 1, Title = "?" });
    }

    private void ButtonAdd_Click(object sender, EventArgs e)
    {
        //вычисляем Id для след.элемента
        int id = _bsCombo.List.Cast<ComboItem>().Max(i => i.Id) + 1;
        //создаем новый элемент
        var item = new ComboItem { Id = id };
        //создаем и настраиваем форму
        var form = new AddForm(item);
        form.Owner = this;
        form.StartPosition = FormStartPosition.CenterParent;

        //если пользователь нажал кнопку Добавить
        if (form.ShowDialog() == DialogResult.OK)
        {
            //добавляем элемент в источник для комбобокса
            _bsCombo.Add(item);
        }
    }
}
Bulson
  • 9,411