[英]DataGridView Image for Button Column
我正在嘗試將可點擊的圖像/按鈕添加到datagridview按鈕列。
圖像/按鈕將是播放或停止的圖標。 如果用戶單擊播放按鈕,則啟動系統上的服務,如果用戶單擊停止按鈕,則服務停止。
我已經編寫了啟動和停止服務的函數。 我遇到的困難是讓按鈕/圖像顯示在數據網格中並使其可點擊。
這是我對代碼的看法:
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";
如果最好使用一個圖像按鈕或一個可點擊的圖像,我就無法解決這個問題。 我也無法正確顯示按鈕。
謝謝Brad
在按鈕上顯示圖像
您可以添加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(someImage, new Rectangle(x, y, w, h));
e.Handled = true;
}
}
顯示沒有按鈕的圖像
要在包括新行的所有行上顯示單個圖像,可以設置DataGridViewImageColumn
的Image
屬性。 這樣,圖像將顯示在所有行的列中:
dataGridView1.Columns.Add(new DataGridViewImageColumn(){
Image = someImage, Name = "someName", HeaderText = "Some Text"
});
此外,如果您可能希望為單元格設置不同的圖像,則可以在CellFormatting
事件中設置DataGridViewImageColumn
的格式化值:
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 = someImage;
}
您還可以將DataGridViewImageColumn
Image
屬性設置為圖像,但圖像不會顯示在新行上。
處理點擊
要處理單擊圖像/按鈕,您可以處理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
,則在使用image列時應該完全單擊圖像。
截圖
這是結果。 第一列是顯示圖像的按鈕列,第二列是設置為顯示單個圖像的普通圖像列:
注意
在上面的例子中,我假設你在someImage
成員變量中有一個圖像:
Image someImage = Properties.Resources.SomeImage
確保在處理表單時處理someImage
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.