4

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

ответ

0

Последний звонок к 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; 
} 
Смежные вопросы