0

画像の丸で囲まれたように、データグリッドビューの余白に小さな画像を追加できるかどうか、またその方法を知りたいと思っていました。つまり、各行の余白に画像が必要です。

注: datagridview に新しい画像列を追加したくありません。

ここに画像の説明を入力

4

1 に答える 1

1

このコードを試してみてください。完全ではありませんが、始めるのに適しています。これにより、すべてのセルに同じ画像が追加されます。画像をクリックすると、メッセージが表示されます (これはカスタマイズできます)。

    //CellPainting event handler to draw image on cell
    private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (e.ColumnIndex > -1 && e.RowIndex > -1 && e.Value != null)
        {
            e.Handled = true;
            e.PaintBackground(e.CellBounds, true);
            e.Graphics.DrawImage(Properties.Resources.YourIMAGE, new Rectangle(e.CellBounds.Left, e.CellBounds.Top + 2, e.CellBounds.Height - 4, e.CellBounds.Height - 4));
            StringFormat sf = new StringFormat() { LineAlignment = StringAlignment.Center };
            e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font, new SolidBrush(e.CellStyle.ForeColor), new Rectangle(e.CellBounds.Left + e.CellBounds.Height, e.CellBounds.Top, e.CellBounds.Width - e.CellBounds.Height, e.CellBounds.Height), sf);                
        }
    }
    bool imageClicked;
    private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
       CheckIfClickOnImage(e);
    }

    private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        CheckIfClickOnImage(e);
    }
    private void CheckIfClickOnImage(DataGridViewCellMouseEventArgs e){
       Rectangle rect = dataGridView1[e.ColumnIndex, e.RowIndex].ContentBounds;
        rect.Offset(-rect.Width + rect.Height + 4, 2);
        rect.Location.Offset(0, 2);
        if (rect.Contains(e.Location))
        {
            imageClicked = true;
            MessageBox.Show(string.Format("You clicked on the image of the cell({0},{1})", e.ColumnIndex, e.RowIndex));
        }
    }
    //Clicking on a cell sometimes makes the clicked cell be in edit mode. So we can avoid this using some kind of flag
    private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
    {
        if (imageClicked)
        {
            e.Cancel = true;
            imageClicked = false;
        }
    }

アップデート

あなたの要件は、以前に投稿したコードよりもはるかに単純です。必要なコードは次のとおりです。

private void dataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
        if (e.ColumnIndex == -1 && e.RowIndex > -1)
        {
            e.Handled = true;
            e.PaintBackground(e.CellBounds, true);
            e.Graphics.DrawImage(Properties.Resources.yourIMAGE, new Rectangle(e.CellBounds.Left + 5, e.CellBounds.Top + 5, e.CellBounds.Width - 10, e.CellBounds.Height - 10));                    
        }
}
//To handle the click on a Row header, you can add custom code to a RowHeaderMouseClick event handler
private void dataGridView_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
   MessageBox.Show(e.RowIndex.ToString());
}
于 2013-06-19T07:48:13.413 に答える