2013-11-27 86 views
2

我想在使用DrawItem事件的DataGridView中的ComboBoxCell中繪製項目。以下是我的代碼。在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

擺脫你的for ...循環。 DrawItem是繪製「一個」項目。 – LarsTech

+0

@LarsTech我刪除了for循環,現在項目正確顯示。但是,當我將鼠標懸停在組合框中的項目上時,它們似乎再次被塗刷,導致它們看起來模糊和變暗。 – user3007740

回答

1

您的繪圖例程看起來像是將網格的RowIndex與ComboBox項目集合的e.Index混淆。不同的東西。

嘗試刪除這個:

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

至於模糊而言,添加以下行來解決這個問題:

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

我有同樣的問題,並通過設置TextRenderingHint固定它e.GraphicsSingleBitPerPixelGridFit財產DrawString

 e.DrawBackground() 
     e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit 
     e.Graphics.DrawString(lstr_h, e.Font, lbrush_fore, e.Bounds) 
     e.DrawFocusRectangle()