Как предотвратить быстрое нажатие на datagridview? - PullRequest
0 голосов
/ 03 апреля 2011

У меня есть сетка данных, в которой я щелкаю столбец флажка, чтобы показать элемент при втором (видимом / невидимом) элементе управления. Когда я быстро нажимаю на кнопку-флажок, иногда нет реакции, на втором элементе управления (MapDialog). Чтобы пропустить это, я хочу запретить пользователю быстрый щелчок (блокировка управления на 0,5 с). Но я не знаю, как это сделать. Я пытаюсь с SuspendLayout, но это не помогает.

private void dgvGeoObjects_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                bool visible = (bool)dgvGeoObjectsFirstView.CurrentCell.EditedFormattedValue;
                DataRow dataRow = ((DataRowView)dgvGeoObjectsFirstView.Rows[e.RowIndex].DataBoundItem).Row;
                foreach (MapDisplayObjectBase sym in _symLayer.DisplayObjects)
                {
                    if (sym.UserObject == dataRow)
                        sym.Visible = visible;
                }

                mapControl.RefreshMap();
            }
            }

Ответы [ 3 ]

0 голосов
/ 03 апреля 2011

Перед использованием Sleep и аналогичных методов попробуйте выяснить, в чем причина проблемы.Пользователь, быстро нажимающий, НЕ является проблемой!проблема в том, что «пользовательский интерфейс не готов вовремя».

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

Если элементы управления / пользовательский интерфейс слишком медленные, попробуйте дать визуальную подсказку, например курсор песочных часовиндикатор выполнения или отключенные элементы управления.

0 голосов
/ 03 апреля 2011

Я исправил это, добавив событие двойного клика:

if (e.ColumnIndex == 0)
            {
                bool visible = (bool)dgvGeoObjectsFirstView.CurrentCell.EditedFormattedValue;
                DataRow dataRow = ((DataRowView)dgvGeoObjectsFirstView.Rows[e.RowIndex].DataBoundItem).Row;
                foreach (MapDisplayObjectBase sym in _symLayer.DisplayObjects)
                {
                    if (sym.UserObject == dataRow)
                        sym.Visible = !visible; //It's important !!
                }

                mapControl.RefreshMap();
            }

Тема. Сон мне не помогает.

0 голосов
/ 03 апреля 2011

Метод 1: Добавить спящий поток.Используйте это, только если вы хотите обрабатывать клики, которые происходят во время сна.Поскольку поток будет в спящем режиме, но щелчки будут записываться во время спящего режима и обрабатываться позже.

Вы можете использовать следующий код, чтобы подождать 1 секунду в событии клика

System.Threading.Thread.Sleep(1000);

Параметры указываются в миллисекундах.

Таким образом, результирующий код может быть:

private void dgvGeoObjects_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                bool visible = (bool)dgvGeoObjectsFirstView.CurrentCell.EditedFormattedValue;
                DataRow dataRow = ((DataRowView)dgvGeoObjectsFirstView.Rows[e.RowIndex].DataBoundItem).Row;
                foreach (MapDisplayObjectBase sym in _symLayer.DisplayObjects)
                {
                    if (sym.UserObject == dataRow)
                        sym.Visible = visible;
                }

                mapControl.RefreshMap();
                System.Threading.Thread.Sleep(100); //I think 0.1 second would be enough.
            }
            }

Метод 2: Если вы хотите, чтобы щелчки игнорировались во время сна (скажем,0,01 сек), лучше использовать таймер.Если кто-то щелкает во время сна, просто добавьте

e.Handled=true;

в событие щелчка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...