Как выделить строку DataGridView, находящуюся под мышью в C#
Недавно кто-то спросил меня, как изменить стиль строки под мышью в элементе управления DataGridView. Этот пример делает это. Когда программа запускается, следующий код подготавливает DataGridView для использования.
// Стиль, который используется, когда мышь находится над строкой. private DataGridViewCellStyle HighlightStyle; private void Form1_Load(object sender, EventArgs e) { // Определим стиль выделения. HighlightStyle = new DataGridViewCellStyle(); HighlightStyle.ForeColor = Color.Red; HighlightStyle.BackColor = Color.Yellow; HighlightStyle.Font = new Font(dgvValues.Font, FontStyle.Bold); // Создаем некоторые элементы данных. dgvValues.Rows.Add(new object[] { "Interview Puzzles Dissected", 15.95m, 1 }); dgvValues.Rows.Add(new object[] { "C# 24-Hour Trainer", 45.00m, 2 }); dgvValues.Rows.Add(new object[] { "Beginning Software Engineering", 45.00m, 5 }); dgvValues.Rows.Add(new object[] { "Essential Algorithms", 60.00m, 3 }); dgvValues.Rows.Add(new object[] { "C# 5.0 Programmer's Reference", 49.99m, 1 }); dgvValues.Rows.Add(new object[] { "Beginning Database Design Solutions", 44.99m, 2 }); // Вычисление итогов. CalculateTotals(); } // Рассчитаем общие затраты. private void CalculateTotals() { // Рассчитаем общие затраты. foreach (DataGridViewRow row in dgvValues.Rows) { // Вычислить общую стоимость. decimal total_cost = (decimal)row.Cells["PriceEach"].Value * (int)row.Cells["Quantity"].Value; // Отображение значения. row.Cells["Total"].Value = total_cost; } }
Переменная HighlightStyle будет содержать стиль, используемый для выделения строки под мышью. Обработчик события Load формы определяет стиль. Затем он добавляет некоторые элементы в элемент управления DataGridView и вызывает метод CalculateTotals.
Метод CalculateTotals проходит через строки управления DataGridView и отображает общее количество раз в каждой строке.
Программа использует следующий метод SetRowStyle, чтобы установить стиль строки для определенного DataGridViewCellStyle.
// Устанавливаем стили ячеек в данной строке. private void SetRowStyle(DataGridViewRow row, DataGridViewCellStyle style) { foreach (DataGridViewCell cell in row.Cells) { cell.Style = style; } }
Этот код проходит через ячейки строки и устанавливает их свойства Style.
Реальное развлечение происходит в событиях мыши мыши DataGridView. Следующий код выполняется, когда мышь входит в одну из элементов управления DataGridView.
// Текущая выделенная ячейка. private int HighlightedRowIndex = -1; // Выделите строку этой ячейки. private void dgvValues_CellMouseEnter(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex == HighlightedRowIndex) return; // Отметьте ранее выделенную строку. if (HighlightedRowIndex >= 0) { SetRowStyle(dgvValues.Rows[HighlightedRowIndex], null); } // Выделите строку, удерживающую мышь. HighlightedRowIndex = e.RowIndex; if (HighlightedRowIndex >= 0) { SetRowStyle(dgvValues.Rows[HighlightedRowIndex], HighlightStyle); } }
Программа сохраняет индекс текущей выделенной строки в переменной HighlightedRowIndex. Когда мышь входит в ячейку, обработчик события сравнивает строку ячейки с HighlightedRowIndex. Если ячейка находится в текущей выделенной строке, правильная строка уже выделена, поэтому обработчик событий ничего не делает.
Программа сохраняет индекс текущей выделенной строки в переменной HighlightedRowIndex. Когда мышь входит в ячейку, обработчик события сравнивает строку ячейки с HighlightedRowIndex. Если ячейка находится в текущей выделенной строке, правильная строка уже выделена, поэтому обработчик событий ничего не делает.
...
Последняя часть кода выполняется, когда мышь покидает ячейку.
// Отметьте выделенную выделенную строку. private void dgvValues_CellMouseLeave(object sender, DataGridViewCellEventArgs e) { if (HighlightedRowIndex >= 0) { SetRowStyle(dgvValues.Rows[HighlightedRowIndex], null); HighlightedRowIndex = -1; } }