2016-11-22 2 views
1

Je prévoyais de faire en sorte que DataGridViewComboboxCell soit similaire à un style fixe 3D d'une zone de texte. Je parviens à le faire avec un Combobox en utilisant ce code:Afficher DataGridViewComboBoxColumn dans le style 3D

public Form1() 
    { 
     cmbbox.DrawMode = DrawMode.OwnerDrawFixed; 
     cmbbox.DrawItem += ComboBox_DrawItem_3DFixed; 
    } 

    private void ComboBox_DrawItem_3DFixed(object sender, DrawItemEventArgs e) 
    { 
     ComboBox cmb = sender as ComboBox; 

     e.DrawBackground(); 
     if (e.State == DrawItemState.Focus) 
      e.DrawFocusRectangle(); 

     var index = e.Index; 
     if (index < 0 || index >= cmb.Items.Count) 
      return; 

     var item = cmb.Items[index]; 
     string text = (item == null) ? "(null)" : cmb.GetItemText(item); 
     using (var brush = new SolidBrush(e.ForeColor)) 
     { 
      e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; 
      e.Graphics.DrawString(text, e.Font, brush, e.Bounds); 
     } 
    } 

Malheureusement, je ne sais pas comment le faire avec le DataGridViewComboBoxCell. Tho je ne trouvais une solution ici:

public void Form1() 
    { 
     dgView.CellPainting += dgView_EditingControlShowing; 
    } 

    void dgView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     if (e.Control is ComboBox) 
     { 
      ComboBox cb = (ComboBox)e.Control; 
      cb.DrawMode = DrawMode.OwnerDrawFixed; 
      cb.DrawItem += new DrawItemEventHandler(ComboBox_DrawItem_3DFixed); 
     } 
    } 

Mais le problème avec cela, il ne change l'apparence de la DataGridViewComboBoxCell lorsque la cellule spécifique est cliqué, et quand il perd le focus, il retourne à la normale.

J'ai trouvé l'événement CellPainting, mais je ne sais pas comment cela fonctionne pour ce code. Quelqu'un peut-il m'aider? Merci!

Répondre

1

Pour créer un style 3D DataGridViewComboBoxColumn Vous devez effectuer ces 2 paramètres:

  1. Vous devez désactiver les styles visuels pour le contrôle d'édition zone de liste déroulante
  2. Vous devez dessiner zone de liste déroulante vous cellule et dessiner un bouton combo 3d

Pour ce faire, gérer EditingControlShowing et CellPaint événement:

[DllImport("uxtheme.dll", ExactSpelling = true, CharSet = CharSet.Unicode)] 
static extern int SetWindowTheme(IntPtr hWnd, String pszSubAppName, String pszSubIdList); 
void dataGridView1_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e) 
{ 
    if (e.Control is ComboBox) 
     SetWindowTheme(e.Control.Handle, "", ""); 
} 
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.ColumnIndex >= 0 && e.RowIndex >= 0 && 
     this.dataGridView1.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn) 
    { 
     var r1 = e.CellBounds; 
     using (var brush = new SolidBrush(e.CellStyle.BackColor)) 
      e.Graphics.FillRectangle(brush, r1); 
     r1.Width --; 
     ControlPaint.DrawBorder3D(e.Graphics, r1, Border3DStyle.Sunken); 
     e.Paint(r1, DataGridViewPaintParts.Border | 
      DataGridViewPaintParts.ContentForeground); 
     var d = SystemInformation.VerticalScrollBarWidth; 
     var r2 = new Rectangle(r1.Right - d - 2, r1.Top + 2, d, r1.Height - 5); 
     ControlPaint.DrawComboButton(e.Graphics, r2, ButtonState.Normal); 
     e.Handled = true; 
    } 
} 

enter image description here

également de créer ci-dessous l'apparence, sans aucun code de personnalisation, il suffit de mettre DisplayStyle de votre colonne ComboBox:

enter image description here

+0

qui ressemble beaucoup, mais est-il un moyen où je peux changer l'apparence de ControlPaint.DrawComboButton, il semble que ce soit 3D fixe. –

+0

Vous vouliez que ce soit 3D. N'est-ce pas? –

+0

Je veux vraiment faire l'apparition sur le haut de l'image, celui ci-dessous est ce que j'ai. Image ici: https://i.imgsafe.org/6467d94258.jpg –