Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/181: Рейтинг темы: голосов - 181, средняя оценка - 4.70
137 / 129 / 59
Регистрация: 13.12.2012
Сообщений: 293
1

Убрать выделение активной ячейки в DataGridView

17.12.2012, 23:04. Показов 34539. Ответов 5
Метки нет (Все метки)

Доброго времени суток

Возникла небольшая проблема. На форме есть dataGridView, у которого при запуске программы всегда становится активной левая верхняя ячейка. Нужно, чтобы при нажатии левой кнопкой мыши на этот компонент ячейка перестала быть активной. Пробовал сделать обработчик события Click
C#
1
2
3
4
private void dataGridView1_Click(object sender, EventArgs e)
        {
            dataGridView1.ClearSelection();//снять выделение всех выбранных ячеек
        }
но проблема в том, что тогда активной становится та ячейка, на которой был произведен этот клик и снимается выделение с нее только после того, как кнопка мыши отпускается, таким образом, если мышь держать нажатой, то ячейка будет выделенной. Нужно сделать так, чтобы снималось выделение со всех ячеек именно при нажатии, а не после того, как мышь будет отпущена. Попробовал сделать обработчик события CellMouseDown
C#
1
2
3
4
private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            dataGridView1.ClearSelection();
        }
но результата никакого нет, по прежнему выделяется ячейка, по которой был произведен клик, только если отпустить мышь, она продолжает быть активной, что, в принципе, логично.
Можно ли как-то обойти это и сделать так, чтобы при нажатии на dataGridView1 ВСЕ ячейки перестали быть активными?

Заранее благодарен за помощь
2
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2012, 23:04
Ответы с готовыми решениями:

Цвет активной ячейки DataGridView
После удаления текущей строки в ентом компоненте через раз теряется цвет активной ячейки (рисунки...

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

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

Выделение столбца от активной ячейки
Как выделить весь столбец до низа от активной ячейки.

5
1445 / 1118 / 344
Регистрация: 11.04.2011
Сообщений: 2,615
18.12.2012, 05:58 2
Все дело в том, что событие OnMouseDown возникает до выбора ячейки, поэтому то, что вы уберете выделение всех ячеек, не помешает выбору следующей ячейки. Попробуйте использовать такой обработчик.
C#
1
2
3
4
5
private void DataGridView1_SelectionChanged(object sender, EventArgs e)
{
    if (MouseButtons != System.Windows.Forms.MouseButtons.None)
        ((DataGridView)sender).CurrentCell = null;
}
Данный код не будет действовать, если вы будете щелкать мышью по выделенной ячейке, так как в этом случае событие SelectionChanged не происходит. В описанной ситуации, как раз, сработает обычный MouseDown, поэтому его тоже нужно оставить:
C#
1
2
3
4
 private void DataGridView1_MouseDown(object sender, MouseEventArgs e)
{
    ((DataGridView)sender).CurrentCell = null;
}
Как вы, наверняка, обратили внимание, выделение я сбрасываю не командой Clearselection(), а изменением свойства CurrentCell. Связано это с тем, что команда ClearSelection не изменяет свойство CurrentCell, соответственно, если ткнуть на текущую, но не выделенную ячейку, редактор в ней все равно откроется. В то же время, занулив текущую ячейку, мы параллельно сбрасываем выделением в гриде, а также исключаем вызов нежелательного редактирования ячейки.
1
605 / 580 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
18.12.2012, 09:20 3
свойства:
C#
1
2
selectionMode=CellSelect;
multiSelect=false;
обработчик:
C#
1
2
3
4
5
6
7
8
private void dgView1_SelectionChanged(object sender, EventArgs e)
        {
            try
            {
                ((DataGridView)sender).SelectedCells[0].Selected = false;
            }
            catch { }
        }
3
137 / 129 / 59
Регистрация: 13.12.2012
Сообщений: 293
18.12.2012, 19:04  [ТС] 4
Спасибо, работает
Только теперь другой вопрос стал непонятным
Я так понимаю, что SelectionChanged вызывается сразу после того, как активная ячейка была изменена, т.е. сначала CurrentCell становится равным null, а после вызывается SelectionChanged, так как активная ячейка была изменена (в данном случае убрана). Но в отладчике показывается, что CurrentCell не сразу зануляется, а только после того, как вызовется SelectionChanged. Аналогичную проверку я решил сделать со свойством Location, там все делается нормально, т.е. сначала изменяется свойство Location, а потом вызывается обработчик изменения этого Location'а


C#
1
2
3
4
5
6
7
8
9
10
11
private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            dataGridView1.Location = new Point(10, 14);//Изменяем Location
            dataGridView1.CurrentCell = null;//Изменяем CurrentCell
        }
private void dataGridView1_LocationChanged(object sender, EventArgs e)
        {
        }
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
        }
Я поставил три точки останова, по одной в начале каждой функции. Таким образом, при нажатии левой кнопки мыши вызывается CellMouseDown. Там первым шагом изменяется Location (на 10, 14). Так как Location был изменен, вызывается LocationChanged, и отладчик переходит туда, при этом Location уже равен (10,14), т.е. обработчик вызвался уже после присваивания. После того, как выполнение обработчика заканчивается, отладка возвращается в CellMouseDown и переходит ко второму оператору, где изменяется CurrentCell. Аналогично после этого, как и для Location'а, отладчик переходит на SelectionChanged, но при этом CurrentCell не равен null, т.е., в отличие от Location'а, значение не присвоилось, а осталось таким, какое было до этого. Оно присваивается только после того, как SelectionChanged завершается, т.е. в этом случае обработчик вызывается не после изменения.

Может, кто-нибудь объяснит этот парадокс? Почему для Location'а один порядок, а для CurrentCell'а другой? А то я что-то совсем не понимаю, в какой последовательности все это вызывается
0
605 / 580 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
19.12.2012, 09:35 5
ну таки это от рассматриваемых классов зависит, про DGV могу сказать только то, что при клике на ячейке:
1) вызывается событие, внутри класса DGV, CellMouseDown
2) вызывается обработчик, уже внутри формы, для этого события, в котором изменяется активная ячейка.
3) продолжают выполняться действия при клике на ячейку внутри класса DGV, в которых происходят сначала изменение текущей ячейки (что делает бесполезным обработчик), потом событие изменения выделения.

возможно даже изменение выделение и не в этом случае, а в каком-нибудь CellMouseUp
1
137 / 129 / 59
Регистрация: 13.12.2012
Сообщений: 293
19.12.2012, 14:26  [ТС] 6
Спасибо, теперь все понятно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2012, 14:26

Выделение цветом активной ячейки в Excel
В Excel активная ячейка выделена границей – как выделить ее цветом? Имею ввиду, что при нажатии...

Убрать выделение активной ссылки
Доброго времени суток ! Как убрать выделение doted рамкой нажатый на странице элемент ?

Выделение диапазона столбца от активной ячейки до последней строки имеющей текст
Добрый день! Подскажите решение проблемы. Есть данные которые заполнены в н-ом диапазоне, допустим,...

Убрать выделение первой ячейки
При создании StringGrid'a всегда есть выделение на cells как его можно убрать, если можно?))...

Как убрать выделение ячейки в StringGrid?
Как убрать выделение ячейки в StringGrid? С цветом разобрался, меня теперь интересует как убрать...

StringGrid: убрать выделение первой ячейки
Доброе время суток. Не могу нормально сформулировать вопрос, поэтому с примером =) На картинке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru