DataGridViewComboBoxColumn -значение отстает на долю секунды

У меня есть DataGridView с несколькими DataGridViewComboBoxColumns. В DataGridView есть обработчик событий CellEnter, позволяющий одним -щелчком выпадающих списков.

Столбец привязан к списку KeyValuePairs, ValueMember — это «Key», а DisplayMember — это «Value».

Когда я нажимаю на столбец со списком, он отлично работает. Однако, если ячейка находится в состоянии «выпадающего списка», и я нажимаю на другое поле со списком (, тот же столбец, другую строку ), он правильно отменяет выбор старой ячейки, выбирает и опускает новую ячейку, однако выбранное значение в top изменяется на значение из старой ячейки на долю секунды, прежде чем вернуться к правильному.

Например, предположим, что это список A, B, C. В строке 1 выбрано значение A, в строке 2 выбрано значение B. Я нажимаю на ячейку в строке 1, все в порядке. Затем, пока эта ячейка раскрывается, я нажимаю на ячейку в строке 2. Он опускается правильно, но выбранное значение сверху становится A, а затем немедленно переключается обратно на B (, правильное значение ).

Если я нажму на ячейку в другом столбце, прежде чем щелкнуть вторую ячейку со списком, этого не произойдет.

Есть ли способ предотвратить это?

Пример кода для воспроизведения проблемы (обработчики событий подключены к очевидным событиям):

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 PDGV
{
    public partial class Form1 : Form
    {
        List<KeyValuePair<string, string>> bindingList = new List<KeyValuePair<string, string>>();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.Rows.Add(10);
            bindingList.Add(new KeyValuePair<string,string>("aaa", "111"));
            bindingList.Add(new KeyValuePair<string,string>("bbb", "222"));
            bindingList.Add(new KeyValuePair<string,string>("ccc", "333"));
            bindingList.Add(new KeyValuePair<string,string>("ddd", "444"));
            bindingList.Add(new KeyValuePair<string,string>("eee", "555"));
            BindComboList(2, bindingList);

        }

        private void BindComboList(int columnIndex, object list)
        {
            var column = dataGridView1.Columns[columnIndex] as DataGridViewComboBoxColumn;
            if (column != null)
            {
                column.DataSource = new BindingSource(list, null);
                column.DisplayMember = "Value";
                column.ValueMember = "Key";
            }
        }

        private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == -1)
                return;

            dataGridView1.BeginEdit(true);
            var control = dataGridView1.EditingControl as DataGridViewComboBoxEditingControl;
            if (control != null)
                control.DroppedDown = true;
        }
    }
}
5
задан svinja 16 July 2012 в 14:07
поделиться