Winforms: редактируемый ComboBox привязан к массиву с проверкой, правильный способ изменить элементы? - PullRequest
0 голосов
/ 19 октября 2018

(в реальном проекте у меня есть сложные формы, связанные со сложными структурами), чтобы упростить задачу, давайте рассмотрим тривиальный пример:

Простейшая форма с редактируемой Комбо, изначально заполненной некоторыми данными из предопределенного массива, пользователь может выбрать элементиз предустановки или «переименовывать элементы (заменить значения в массиве)» основывается на некотором правиле (в приведенном ниже примере должно заканчиваться на «Item»), изменения должны быть «отменены», если новое имя не соответствует правилу.В конце у меня должен быть фактический массив, где все элементы соответствуют правилу и выбранному элементу.

Я нашел два подхода для достижения этой цели, но я подозреваю, что оба не являются «правильным путем».С другой стороны, задача выглядит как «уже 1000 раз реализовано другими», есть ли другой «стандартный метод», чтобы это сделать?

Мои решения:

1. Отслеживание отслеживаниятекущего элемента в событии TextUpdate:

public partial class Form1 : Form
{
    private string[] items = { "firstItem", "secondItem", "thirdItem" };
    private string lastSelectesItem = null;

    public Form1()
    {
        InitializeComponent();
        comboBox1.DataSource = items;
    }

    private void comboBox1_TextUpdate(object sender, EventArgs e)
    {
        if (comboBox1.SelectedItem!=null)
            lastSelectesItem = comboBox1.SelectedItem as string;
    }

    private void comboBox1_Validating(object sender, CancelEventArgs e)
    {
        var text = comboBox1.Text;
        if (!text.EndsWith("Item"))
        {
            e.Cancel = true;
            comboBox1.SelectedItem = lastSelectesItem;
        }
    }

    private void comboBox1_Validated(object sender, EventArgs e)
    {
        var text = comboBox1.Text;
        comboBox1.DataSource = null;
        var lastSelectedItemIndex = Array.IndexOf(items, lastSelectesItem);
        items[lastSelectedItemIndex] = text;
        comboBox1.DataSource = items;
        comboBox1.SelectedItem = items[lastSelectedItemIndex];
    }
}

2.Трюки с CurrencyManager:

public partial class Form1 : Form
{
    private string[] items = { "firstItem", "secondItem", "thirdItem" };

    public Form1()
    {
        InitializeComponent();
        comboBox1.DataSource = items;
    }

    private void comboBox1_Validating(object sender, CancelEventArgs e)
    {
        var text = comboBox1.Text;
        if (!text.EndsWith("Item"))
        {
            e.Cancel = true;
            CurrencyManager currencyManager = this.BindingContext[comboBox1.DataSource] as CurrencyManager;
            comboBox1.SelectedItem = currencyManager.Current;
        }
    }

    private void comboBox1_Validated(object sender, EventArgs e)
    {
        var text = comboBox1.Text;

        CurrencyManager currencyManager = this.BindingContext[comboBox1.DataSource] as CurrencyManager;
        var lastSelectedItemIndex = Array.IndexOf(items, currencyManager.Current);
        comboBox1.DataSource = null;
        items[lastSelectedItemIndex] = text;
        comboBox1.DataSource = items;
        comboBox1.SelectedItem = items[lastSelectedItemIndex];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...