(в реальном проекте у меня есть сложные формы, связанные со сложными структурами), чтобы упростить задачу, давайте рассмотрим тривиальный пример:
Простейшая форма с редактируемой Комбо, изначально заполненной некоторыми данными из предопределенного массива, пользователь может выбрать элементиз предустановки или «переименовывать элементы (заменить значения в массиве)» основывается на некотором правиле (в приведенном ниже примере должно заканчиваться на «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];
}
}