вопрос по dataGridView на C#
От: system.console  
Дата: 28.05.24 13:42
Оценка:
Подскажите плис, как сделать, чтобы при потере сабжем фокуса ввода, в нем не выделялась текущая строка/ячейка ?
Делаю простую студенческую прогу, где dataGridView используется для ввода элементов числовой матрицы и мне нафиг не надо, чтобы, когда я кликаю на другой контрол, текущая ячейка выделялась цветом отличным от всех остальных
Re: вопрос по dataGridView на C#
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 28.05.24 15:52
Оценка: +1
Здравствуйте, system.console, Вы писали:

SC>Подскажите плис, как сделать, чтобы при потере сабжем фокуса ввода, в нем не выделялась текущая строка/ячейка ?

Ну первое, что приходит на ум, это решение "в лоб" — в событии LostFocus очищать выделение, вызывая ClearSelection()
Re[2]: вопрос по dataGridView на C#
От: system.console  
Дата: 30.05.24 13:06
Оценка:
SC>>Подскажите плис, как сделать, чтобы при потере сабжем фокуса ввода, в нем не выделялась текущая строка/ячейка ?
МР>Ну первое, что приходит на ум, это решение "в лоб" — в событии LostFocus очищать выделение, вызывая ClearSelection()
разве же это в лоб ?!
В лоб — это уствноить SelectionBackColor и SelectionForeColor в такие же цвета как и BackColor, ForeColor ж)
Re[3]: вопрос по dataGridView на C#
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 30.05.24 13:20
Оценка:
Здравствуйте, system.console, Вы писали:

SC>В лоб — это уствноить SelectionBackColor и SelectionForeColor в такие же цвета как и BackColor, ForeColor ж)

Такой вариант я тоже рассматривал, но решил, что потенциально там может быть больше проблем — например, если установить эти цвета сразу и на всё время, то отличать выделенные строки от остальных будет визуально сложнее.
С другой стороны, если менять цвета так же в момент потери фокуса — от моего варианта будет минимум отличий (да еще будет плюс — у вас сохранится информация о выделении, если это нужно).
Re[4]: вопрос по dataGridView на C#
От: system.console  
Дата: 30.05.24 15:03
Оценка:
SC>>В лоб — это уствноить SelectionBackColor и SelectionForeColor в такие же цвета как и BackColor, ForeColor ж)
МР>Такой вариант я тоже рассматривал, но решил, что потенциально там может быть больше проблем — например, если установить эти цвета сразу и на всё время, то отличать выделенные строки от остальных будет визуально сложнее.
МР>С другой стороны, если менять цвета так же в момент потери фокуса — от моего варианта будет минимум отличий (да еще будет плюс — у вас сохранится информация о выделении, если это нужно).
если можно, просто ради любопытства, фрагмент кода реализующий это предложение
Я проблему уже решил тупой установкой SelectionBack(Fore)Color раз и навсегда в инспекторе свойств.
Просто ради самообразования, ибо VS, как и C# по сути-то я не знаю.
Re[5]: вопрос по dataGridView на C#
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 04.06.24 15:45
Оценка: +1
Здравствуйте, system.console, Вы писали:

SC>>>В лоб — это уствноить SelectionBackColor и SelectionForeColor в такие же цвета как и BackColor, ForeColor ж)

МР>>Такой вариант я тоже рассматривал, но решил, что потенциально там может быть больше проблем — например, если установить эти цвета сразу и на всё время, то отличать выделенные строки от остальных будет визуально сложнее.
МР>>С другой стороны, если менять цвета так же в момент потери фокуса — от моего варианта будет минимум отличий (да еще будет плюс — у вас сохранится информация о выделении, если это нужно).
SC>если можно, просто ради любопытства, фрагмент кода реализующий это предложение
SC>Я проблему уже решил тупой установкой SelectionBack(Fore)Color раз и навсегда в инспекторе свойств.
SC>Просто ради самообразования, ибо VS, как и C# по сути-то я не знаю.

Вот пример с обоими вариантами http://files.rsdn.org/29231/WindowsFormsApp1.zip
Решение выглядит примерно вот так:
private void dataGridView1_Leave(object sender, EventArgs e)
{
    // Вариант 1
    //dataGridView1.ClearSelection();

    // Вариант 2
    foreach (var cell in dataGridView1.SelectedCells.OfType<DataGridViewCell>())
    { 
        cell.Style.SelectionForeColor=
            dataGridView1.DefaultCellStyle.ForeColor;
        cell.Style.SelectionBackColor =
            dataGridView1.DefaultCellStyle.BackColor;
    }

}

private void dataGridView1_Enter(object sender, EventArgs e)
{
    // Вариант 2
    foreach (var cell in dataGridView1.SelectedCells.OfType<DataGridViewCell>())
    {
        cell.Style.SelectionForeColor =
            dataGridView1.DefaultCellStyle.SelectionForeColor;
        cell.Style.SelectionBackColor =
            dataGridView1.DefaultCellStyle.SelectionBackColor;
    }
}



Увы, но вариант с заменой цветов сработал только частично. С ячеек выделение снимается, но остается на заголовке столбца и строки.

А вот мой первоначальный вариат со снятием выделения и проще, и сработал лучше (он в коде закомментирован)
Re: вопрос по dataGridView на C#
От: _FRED_ Черногория
Дата: 04.07.24 13:45
Оценка:
Здравствуйте, system.console, Вы писали:

SC>Подскажите плис, как сделать, чтобы при потере сабжем фокуса ввода, в нем не выделялась текущая строка/ячейка ?

SC>Делаю простую студенческую прогу, где dataGridView используется для ввода элементов числовой матрицы и мне нафиг не надо, чтобы, когда я кликаю на другой контрол, текущая ячейка выделялась цветом отличным от всех остальных

Я бы обрабатывал CellPainting событие как-то так (для случая, когда в гриде выделяется только одна ячейка):
private void OnDataGridViewCellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
  if(e.State.HasFlag(DataGridViewElementStates.Selected) && sender is DataGridView { ContainsFocus: false, }) {
    e.Paint(e.ClipBounds, e.PaintParts & ~DataGridViewPaintParts.SelectionBackground);
    e.Handled = true;
  }//if
}

(можно смело использоовать HasFlag потому что https://github.com/dotnet/runtime/issues/6080)

Если же выделяется целая строка, то можно иначе, через RowPrePaint и Leave (чтобы перерисовать всю строчку):
private static void OnDataGridViewRowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) {
  if(e.PaintParts.HasFlag(DataGridViewPaintParts.SelectionBackground) && sender is DataGridView { ContainsFocus: false, }) {
    e.PaintParts &= ~DataGridViewPaintParts.SelectionBackground;
  }//if
}

private static void OnDataGridViewLeave(object sender, EventArgs e) {
  if(sender is DataGridView view) {
    foreach(var item in view.SelectedRows.Cast<DataGridViewRow>()) {
      view.InvalidateRow(item.Index);
    }//for
  }//if
}
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.