2013-11-27 3 views
2

Я пытаюсь нарисовать элементы в ComboBoxCell в DataGridView с помощью события DrawItem. Следующий мой код.Пользовательские элементы ничья в ComboBoxCell

Обновленный код:

private void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     int index = dgv.CurrentCell.ColumnIndex; 
     if (index == FormatColumnIndex) 
     { 
      var combobox = e.Control as ComboBox; 
      if (combobox == null) 
       return; 
      combobox.DrawMode = DrawMode.OwnerDrawFixed; 
      combobox.DrawItem -= combobox_DrawItem; 
      combobox.DrawItem += new DrawItemEventHandler(combobox_DrawItem); 
     }    
    } 

void combobox_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     if (e.Index < 0) 
     { 
      return; 
     } 
     int index = dgv.CurrentCell.RowIndex; 
     if (index == e.Index) 
     { 
      DataGridViewComboBoxCell cmbcell = (DataGridViewComboBoxCell)dgv.CurrentRow.Cells["ProductFormat"]; 

      string productID = dgv.Rows[cmbcell.RowIndex].Cells["ProductID"].Value.ToString(); 

       string item = cmbcell.Items[e.Index].ToString(); 
       if (item != null) 
       { 
        Font font = new System.Drawing.Font(FontFamily.GenericSansSerif, 8); 
        Brush backgroundColor; 
        Brush textColor; 

        if (e.State == DrawItemState.Selected) 
        { 
         backgroundColor = SystemBrushes.Highlight; 
         textColor = SystemBrushes.HighlightText; 
        } 
        else 
        { 
         backgroundColor = SystemBrushes.Window; 
         textColor = SystemBrushes.WindowText; 
        } 
        if (item == "Preferred" || item == "Other") 
        { 
         font = new Font(font, FontStyle.Bold); 
         backgroundColor = SystemBrushes.Window; 
         textColor = SystemBrushes.WindowText; 
        }       


        if (item != "Select" && item != "Preferred" && item != "Other") 
         e.Graphics.DrawString(item, font, textColor, new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)); 
        else 
         e.Graphics.DrawString(item, font, textColor, e.Bounds); 
       } 
      } 
     } 
    } 

Элементы отображаются правильно, но выпадающий кажется неуместным и выглядит неуклюжим.

Также, когда я наводил курсор на выпадающие предметы, они, похоже, снова нарисованы, что делает их более темными и размытыми. Как я могу это исправить? Благодарю.

+0

Почему вы используете 'if-else' для рисования строки несколько строк по-разному (с разными границами текста), на самом деле текстовые границы должны быть тщательно извлечены/вычислены из' e.Bounds'. –

+0

Избавьтесь от вашего ... цикла. DrawItem должен нарисовать «один» элемент. – LarsTech

+0

@LarsTech Я удалил цикл for, и теперь элементы отображаются правильно. Однако, когда я наводил курсор на элементы в выпадающем списке, они, похоже, снова нарисованы, заставляя их выглядеть размытыми и темными. – user3007740

ответ

1

Ваша процедура рисования выглядит так, что это путает RowIndex сетки с e.Index коллекции элементов ComboBox. Разные вещи.

Попробуйте удалить это:

// int index = dgv.CurrentCell.RowIndex; 
// if (index == e.Index) { 

Насколько размытость обеспокоен, добавьте следующую строку, чтобы установить, что:

void combobox_DrawItem(object sender, DrawItemEventArgs e) { 
    e.DrawBackground(); 
0

У меня была такая же проблема, и установил ее, установив TextRenderingHint свойство e.Graphics к SingleBitPerPixelGridFit перед вызовом DrawString:

 e.DrawBackground() 
     e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit 
     e.Graphics.DrawString(lstr_h, e.Font, lbrush_fore, e.Bounds) 
     e.DrawFocusRectangle() 
Смежные вопросы