2016-03-27 3 views
2

Я пытаюсь добавить кликабельное изображение/кнопку в столбец кнопки datagridview.DataGridView Image for Button Column

Изображение/кнопка будет значком для воспроизведения или остановки. Если пользователь нажимает кнопку воспроизведения, запускается служба в системе, если пользователь нажимает кнопку остановки, служба останавливается.

У меня уже есть функции для запуска и остановки обслуживания. То, с чем мне сложно, - это получить кнопку/изображение, отображаемое в datagrid, и сделать его доступным для клика.

Вот что у меня есть для кода:

this.dgrdServices.RowPrePaint +=new DataGridViewRowPrePaintEventHandler(dgv_RowPrePaint); 
this.dgrdServices.Rows.Add(); 
this.dgrdServices.Rows[0].Cells[0].Value = Image.FromFile(@"C:\users\brad\desktop\green-dot.gif"); 
this.dgrdServices.Rows[0].Cells[1].Value = "MyServer"; 
this.dgrdServices.Rows[0].Cells[2].Value = "MyService"; 
this.dgrdServices.Rows[0].Cells[3].Value = "Started"; 
this.dgrdServices.Rows[0].Cells[4].Value = new DataGridViewButtonCell(); 
this.dgrdServices.Rows[0].Cells[5].Value = "Uninstall"; 

Я не могу работать, если было бы лучше использовать кнопку, которая является изображение или только изображение, это кликабельны. Я также не могу получить кнопку для правильного отображения.

Благодаря Брэд

+0

http://www.codeproject.com/KB/grid/DGV_ImageButtonCell.aspx – MethodMan

+0

Итак, когда вы говорите, что это не отображается правильно, это просто не появляется вообще? Он показывает, но что-то не так с дисплеем? – Jace

+0

Я пробовал различные биты кода из примеров, которые я могу найти. Я либо заканчиваю серой кнопкой без метки, либо серой кнопкой, которая говорит об этом. Также я не могу работать, когда нажимается кнопка для вызова моей функции, которая запускает/останавливает службу. – Brad

ответ

5

Показать изображение на кнопке

Вы можете добавить DataGridViewButtonColumn, а затем обработать CellPainting событие сетки и проверить, если событие вызывается для столбца кнопки, затем нарисуйте изображение в теме. В конце мероприятия не забудьте установить e.Handled = true;.

В коде ниже я должен у вас есть ресурс изображения как SomeImage:

private void grid_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.RowIndex < 0) 
     return; 

    //I supposed your button column is at index 0 
    if (e.ColumnIndex == 0) 
    { 
     e.Paint(e.CellBounds, DataGridViewPaintParts.All); 

     var w = Properties.Resources.SomeImage.Width; 
     var h = Properties.Resources.SomeImage.Height; 
     var x = e.CellBounds.Left + (e.CellBounds.Width - w)/2; 
     var y = e.CellBounds.Top + (e.CellBounds.Height - h)/2; 

     e.Graphics.DrawImage(Properties.Resources.SomeImage, new Rectangle(x, y, w, h)); 
     e.Handled = true; 
    } 
} 

Показать изображение без кнопки

Чтобы показать одно изображение на все строки, включая новую строку, вы можете установить Image Недвижимость DataGridViewImageColumn. Таким образом, изображение будет показано в этой колонке на все строки:

dataGridView1.Columns.Add(new DataGridViewImageColumn(){ 
    Image = Properties.Resources.SomeImage, Name = "someName", HeaderText = "Some Text" 
}); 

Кроме того, если вы можете иметь различные изображения для ячеек, вы можете установить отформатированное значение DataGridViewImageColumn в CellFormatting событии:

void grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    if (e.RowIndex < 0) 
     return; 

    //I supposed the image column is at index 1 
    if (e.ColumnIndex == 1) 
     e.Value = Properties.Resources.SomeImage; 
} 

Вы также можете установить Image property of DataGridViewImageColumn, но изображение не будет отображаться на новой строке.

Ручка Нажмите

Для обработки Нажмите на изображение/кнопку, вы можете обрабатывать CellClick или CellContentClick событие:

void grid_CellClick(object sender, DataGridViewCellEventArgs e) 
{ 
    if (e.RowIndex < 0) 
     return; 

    //I suposed you want to handle the event for column at index 1 
    if (e.ColumnIndex == 1) 
     MessageBox.Show("Clicked!"); 
} 

Если вы обрабатываются CellContentClick вы должны точно нажать на изображение при использовании колонки изображения ,

Скриншот

Вот результат.Первая колонка представляет собой кнопку столбец, показывающий изображение и второй столбец является нормальным столбец заданного изображения, чтобы показать одно изображение:

enter image description here

+0

Я получил эту работу, но пару комментариев - теперь я вижу кнопку с изображением поверх нее. Я действительно хочу видеть только изображение. Хотя изображение должно быть доступно для клика. – Brad

+0

Это кнопочный столбец, который показывает изображение, которое вы искали * Я пытаюсь добавить кнопку clickable image/button в столбец кнопки datagridview. * –

+0

Если вы хотите только изображение, вы можете просто использовать 'DataGridViewImageColumn' , –