Есть ли способ сделать DataGridView не выбранной ячейкой? Я замечаю, что даже когда он теряет фокус(), он имеет по крайней мере одну активную ячейку. Есть ли другой способ, который позволяет это? или какой-то другой трюк?WinForms - DataGridView - не выбрана ячейка
ответ
Свойство DataGridView.CurrentCell может использоваться для очистки прямоугольника фокусировки.
Вы можете установить это свойство (DataGridView.CurrentCell) к нулю, чтобы временно удалить фокус прямоугольника, но когда управление получает фокус и значение этого собственности имеет нулевое значение, то автоматически набор к значению свойства FirstDisplayedCell.
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.currentcell.aspx
Я обнаружил, что DataGridView.CurrentCell = null
не работает для меня при попытке получить запрашиваемую поведение.
То, что я в конечном итоге использовала было:
private void dgvMyGrid_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
if (dgvMyGrid.SelectedRows.Count > 0)
{
dgvMyGrid.SelectedRows[0].Selected = false;
}
dgvMyGrid.SelectionChanged += dgvMyGrid_SelectionChanged;
}
Это необходимо, чтобы быть в обработчике DataBindingComplete
событий.
Приложение, в котором вы прикрепляете обработчик событий SelectionChanged
, не влияет на желаемое поведение, но я оставил его в фрагменте кода, потому что я заметил, что для своих нужд, по крайней мере, было бы лучше прикрепить обработчик после привязки данных, чтобы я избегал выбор измененного события, поднятого для каждого связанного элемента.
Я потратил часы, чтобы найти решение этой проблемы. Сделайте это:
- Создание формы проекта
- Добавить DataGridView с именем "dataGridView1"
Добавьте следующий код в класс Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim dgvRow(17) As DataGridViewRow Dim i As Integer For i = 0 To dgvRow.Length - 1 dgvRow(i) = New DataGridViewRow() dgvRow(i).Height = 16 dgvRow(i).Selected = False dgvRow(i).ReadOnly = True DataGridView1.Rows.Add(dgvRow(i)) DataGridView1.CurrentRow.Selected = False Next End Sub
importaint линия кода
DataGridView1.CurrentRow.Selected = False
Удачи!
Проблема с установкой DataGridView.CurrentCell в значение null в событии изменения выбора заключается в том, что последующие события (например, щелчок) не будут удалены.
Вариант, который работал для меня, заключался в изменении цвета выделения на цвет сетки. Поэтому выбор не будет видимым.
RowsDefaultCellStyle.SelectionBackColor = BackgroundColor;
RowsDefaultCellStyle.SelectionForeColor = ForeColor;
Ваше решение не сделает DataGridView без выбранной ячейки. Это просто появление ... – nbadaud 2016-09-02 08:23:03
У меня была аналогичная проблема, и я последовал за этот путь:
'Initial активную ячейку' очищенную от dataGridView.ClearSelection().
Очистить/Игнорировать выделение в обработчике событий, событие CellMouseClick.
void dataGridView_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) { DataGridView dgv = sender as DataGridView; dgv.ClearSelection(); }
Я знаю, что это старый вопрос и WinForms заменен (но не долго, пока еще в нашем магазине в любом случае), так что это еще актуально для нас, и я тоже подозреваю, что несколько других.
Вместо того, чтобы возиться с выбором или CurrentCell
, я нашел реализацию, чтобы просто изменить цвета выбора строк, намного более подходящие для наших нужд.
Кроме того, мне больше не нужно отслеживать старую выделенную ячейку, когда теряете фокус, и не имеете дело с сложной проблемой, когда сетка обновляется, когда не фокусируется (например, таймером), а старая выделенная ячейка не может быть " восстанавливается "при возврате фокуса.
В дополнение к решениям, уже опубликованным выше, мы не смогли (не захотели) наследовать от управления DataGridView
и вместо этого решили использовать композицию. В приведенном ниже коде показан класс, используемый для реализации функций, а затем код о том, как использовать его для «привязки» поведения к DataGridView.
/// <summary>
/// Responsible for hiding the selection of a DataGridView row when the control loses focus.
/// </summary>
public class DataGridViewHideSelection : IDisposable
{
private readonly DataGridView _dataGridView;
private Color _alternatingRowSelectionBackColor = Color.Empty;
private Color _alternatingRowSelectionForeColor = Color.Empty;
private Color _rowSelectionBackColor = Color.Empty;
private Color _rowSelectionForeColor = Color.Empty;
/// <summary>
/// Initializes a new instance of the <see cref="DataGridViewHideSelection"/> class.
/// </summary>
/// <param name="dataGridView">The data grid view.</param>
public DataGridViewHideSelection(DataGridView dataGridView)
{
if (dataGridView == null)
throw new ArgumentNullException("dataGridView");
_dataGridView = dataGridView;
_dataGridView.Enter += DataGridView_Enter;
_dataGridView.Leave += DataGridView_Leave;
}
/// <summary>
/// Handles the Enter event of the DataGridView control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
private void DataGridView_Enter(object sender, EventArgs e)
{
// Restore original colour
if (_rowSelectionBackColor != Color.Empty)
_dataGridView.RowsDefaultCellStyle.SelectionBackColor = _rowSelectionBackColor;
if (_rowSelectionForeColor != Color.Empty)
_dataGridView.RowsDefaultCellStyle.SelectionForeColor = _rowSelectionForeColor;
if (_alternatingRowSelectionBackColor != Color.Empty)
_dataGridView.AlternatingRowsDefaultCellStyle.SelectionBackColor = _alternatingRowSelectionBackColor;
if (_alternatingRowSelectionForeColor != Color.Empty)
_dataGridView.AlternatingRowsDefaultCellStyle.SelectionForeColor = _alternatingRowSelectionForeColor;
}
/// <summary>
/// Handles the Leave event of the DataGridView control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
private void DataGridView_Leave(object sender, EventArgs e)
{
// Backup original colour
_rowSelectionBackColor = _dataGridView.RowsDefaultCellStyle.SelectionBackColor;
_rowSelectionForeColor = _dataGridView.RowsDefaultCellStyle.SelectionForeColor;
_alternatingRowSelectionBackColor = _dataGridView.RowsDefaultCellStyle.SelectionBackColor;
_alternatingRowSelectionForeColor = _dataGridView.RowsDefaultCellStyle.SelectionForeColor;
// Change to "blend" in
_dataGridView.RowsDefaultCellStyle.SelectionBackColor = _dataGridView.RowsDefaultCellStyle.BackColor;
_dataGridView.RowsDefaultCellStyle.SelectionForeColor = _dataGridView.RowsDefaultCellStyle.ForeColor;
_dataGridView.AlternatingRowsDefaultCellStyle.SelectionBackColor = _dataGridView.AlternatingRowsDefaultCellStyle.BackColor;
_dataGridView.AlternatingRowsDefaultCellStyle.SelectionForeColor = _dataGridView.AlternatingRowsDefaultCellStyle.ForeColor;
}
#region IDisposable implementation (for root base class)
private bool _disposed;
/// <summary>
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
/// </summary>
/// <remarks>
/// Called by consumers.
/// </remarks>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// Disposes this instance, with an indication whether it is called from managed code or the GC's finalization of this instance.
/// </summary>
/// <remarks>
/// Overridden by inheritors.
/// </remarks>
/// <param name="disposingFromManagedCode">if set to <c>true</c> disposing from managed code.</param>
protected virtual void Dispose(Boolean disposingFromManagedCode)
{
if (_disposed)
return;
// Clean up managed resources here
if (disposingFromManagedCode)
{
if (_dataGridView != null)
{
_dataGridView.Enter -= DataGridView_Enter;
_dataGridView.Leave -= DataGridView_Leave;
}
}
// Clean up any unmanaged resources here
// Signal disposal has been done.
_disposed = true;
}
/// <summary>
/// Finalize an instance of the <see cref="DataGridViewHideSelection"/> class.
/// </summary>
~DataGridViewHideSelection()
{
Dispose(false);
}
#endregion
}
/// <summary>
/// Extends data grid view capabilities with additional extension methods.
/// </summary>
public static class DataGridViewExtensions
{
/// <summary>
/// Attaches the hide selection behaviour to the specified DataGridView instance.
/// </summary>
/// <param name="dataGridView">The data grid view.</param>
/// <returns></returns>
/// <exception cref="System.ArgumentNullException">dataGridView</exception>
public static DataGridViewHideSelection AttachHideSelectionBehaviour(this DataGridView dataGridView)
{
if (dataGridView == null)
throw new ArgumentNullException("dataGridView");
return new DataGridViewHideSelection(dataGridView);
}
}
Использование: Для использования создается экземпляр класса DataGridViewHideSelection и распоряжаться им, если вам не нужна функциональность любого-больше.
var hideSelection = new DataGridViewHideSelection(myGridView);
// ...
/// When no longer needed
hideSelection.Dispose();
В качестве альтернативы, вы можете использовать удобный метод расширения AttachHideSelectionBehaviour()
, чтобы сделать жизнь немного легче.
myDataGrid.AttachHideSelectionBehaviour();
Возможно, это полезно кому-то еще.
Используйте DataGridView.ClearSelection(), если хотите очистить фокус/выбор (например, InitializeComponent, Control.LostFocus, Form.Load).
Это помогает много Спасибо – 2011-09-12 10:54:44