Показать выбранное изображение в DataGridView с DataGridViewComboBoxColumn? - PullRequest
4 голосов
/ 15 февраля 2012

У меня проблема с использованием DataGridView с DataGridViewComboBoxColumn, чтобы позволить пользователю выбрать изображение из списка изображений.После обсуждений в Вопросе под названием «Пользовательский розыгрыш DatagridViewComboBoxColumn» ссылка Link .Я также сталкиваюсь с проблемой, поскольку изображение рисуется только тогда, когда ячейка находится в режиме редактирования.Выбранное изображение исчезнет, ​​когда я щелкну где-нибудь вне ячейки со списком!Я реализовал событие CellPainting, чтобы перерисовать изображение, но все еще не могу решить проблему.Я протестировал DataGridViewComboBoxColumn со следующими кодами:

    public Form1()
    {
        InitializeComponent();
        .....
        imageList.Images.Add(Properties.Resources.icon_priority_low);
        imageList.Images.Add(Properties.Resources.icon_priority_medium);
        .....
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        .....            
        DataGridViewComboBoxCell dgvcbc = (DataGridViewComboBoxCell)newDataGridView1.Rows[0].Cells[1];
        dgvcbc.Items.Add("test0");
        dgvcbc.Items.Add("test1");
        .....        
    }

     private void newDataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control is ComboBox)
        {
            ComboBox theCB = (ComboBox)e.Control;
            theCB.DrawMode = DrawMode.OwnerDrawFixed;
            try
            {
                theCB.DrawItem -= combobox1_DrawItem;
            }
            catch { }
            theCB.DrawItem += combobox1_DrawItem;
        }
    }

    private void combobox1_DrawItem(object sender, DrawItemEventArgs e)
    {
        Graphics g = e.Graphics;
        Brush br = SystemBrushes.WindowText;
        Brush brBack;
        Rectangle rDraw;
        bool bSelected = e.State == DrawItemState.Selected;
        bool bValue = e.State == DrawItemState.ComboBoxEdit;

        if ((e.Index < 0) || (columnIndex != 1))
            return;

        rDraw = e.Bounds;
        rDraw.Inflate(-1, -1);

        int x, y;

        x = e.Bounds.Left + 25;
        y = e.Bounds.Top + 1;
        int midX = (int)(e.Bounds.Width / 2) + e.Bounds.Left;

        // Show image and ignore text.
        g.DrawImage(imageList.Images[e.Index], new Rectangle(midX - 6, y + 2, 12, 12));                     
    }

    private void newDataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
    {
        if (columnIndex != 1)
            return;

        Graphics g = e.Graphics;
        Rectangle rDraw = newDataGridView1.GetCellDisplayRectangle(columnIndex, rowIndex, true);

        e.PaintBackground(e.ClipBounds, true);
        e.PaintContent(e.ClipBounds);

        using (Brush backColorBrush = new SolidBrush(e.CellStyle.BackColor))
        {
            int y = rDraw.Y + 1;
            int midX = (int)(rDraw.Width / 2) + rDraw.X;

            g.DrawImage(imageList.Images[0], new Rectangle(midX - 6, y + 2, 12, 12));

            e.PaintContent(e.ClipBounds);
            e.Handled = true;
        }
    }
}

В ячейке будет отображаться «test0» вместо изображений [0], если я нажму на другие ячейки DataGridView.Не могли бы вы помочь решить эту проблему.Большое спасибо.

1 Ответ

0 голосов
/ 31 августа 2015

Последний вызов PaintContent() стирает ваше нарисованное изображение.

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

private void newDataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (columnIndex != 1)
        return;

    Graphics g = e.Graphics;
    Rectangle rDraw = newDataGridView1.GetCellDisplayRectangle(columnIndex, rowIndex, true);

    e.Paint(e.CellBounds, e.PaintParts & ~DataGridViewPaintParts.ContentForeground);

    int y = rDraw.Y + 1;
    int midX = (int)(rDraw.Width / 2) + rDraw.X;

    g.DrawImage(imageList.Images[0], new Rectangle(midX - 6, y + 2, 12, 12));

    e.Handled = true;
}
...