Как выделить строку 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;
}
}
