События ячейки в отключенном DataGridView - PullRequest
0 голосов
/ 06 ноября 2018

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

Один столбец с изображением должен быть кликабельным, с ручным курсором.
События CellClick и CellMouseEnter не сработали, поскольку сетка отключена.

Есть решение?

1 Ответ

0 голосов
/ 06 ноября 2018

Сначала определите некоторые свойства, используя DataGridView Designer.
Выберите DataGridView, в его списке свойств найдите DefaultCellStyle и откройте редактор.

Нам нужно установить SelectionForeColor и SelectionBackColor равными ForeColor и BackColor свойствам. Это предотвратит изменение цвета ячейки при выборе.
Здесь я устанавливаю Color.White для BackGround и Color.Black для ForeGround.
Измените его на что угодно, они просто должны быть одинаковыми для обеих пар .

DataGridView DefaultCellStyle Properties

Сразу после того, как вы установили DataSource из DataGridView (или вставили строки данных другим способом), измените ReadOnly и, если необходимо, Frozen свойства всех столбцов, кроме той, которая отображает изображения. Здесь я просто использую поле int, установленное на индекс столбца.
Он также может быть получен путем проверки [Cell].ValueType каждой колонки.

//Define which Column contains an Image
int ImageColumn = 2;

foreach (DataGridViewColumn column in dataGridView1.Columns)
{
    if (column.Index != ImageColumn)
    {
        column.Frozen = true;
        column.ReadOnly = true;
    }
}

Подписаться на события CellMouseEnter и CellMouseLeave .
Они используются для изменения курсора на классическую форму руки, когда указатель мыши входит в ячейку, содержащую изображение, и для сброса его к значению по умолчанию, когда он покидает его.

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

public form1()
{
    InitializeComponent();

    this.dataGridView1.CellMouseEnter += (s, e) => 
        { if (e.ColumnIndex == ImageColumn) dataGridView1.Cursor = Cursors.Hand; };

    this.dataGridView1.CellMouseLeave += (s, e) => 
        { if (e.ColumnIndex == ImageColumn) dataGridView1.Cursor = Cursors.Default; };
}
...