2016-11-22 11 views
1

Я планировал сделать DataGridViewComboboxCell таким же, как 3D Fixed Style в текстовом поле. Мне удается сделать это с помощью Combobox, используя этот код:Показать DataGridViewComboBoxColumn в 3d Style

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); 
     } 
    } 

К сожалению, я не знаю, как сделать это с DataGridViewComboBoxCell. Тхо Я нашел решение здесь:

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); 
     } 
    } 

Но проблема с этим, он только меняет внешний вид DataGridViewComboBoxCell когда щелкнул конкретная ячейка, и когда он теряет фокус, он возвращается в нормальное русло.

Я нашел событие CellPainting, но я не знаю, как это работает для этого кода. Может кто-нибудь мне помочь? Благодаря!

ответ

1

Чтобы создать 3D стиль DataGridViewComboBoxColumn Вы должны выполнить эти 2 настройки:

  1. Вы должны отключить визуальные стили для комбинированного окна редактирования управления
  2. Вы должны нарисовать выпадающий ячейку себя и нарисовать кнопку 3d комбо

Для этого, ручка EditingControlShowing и CellPaint событие:

[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

Кроме того, чтобы создать ниже внешний вид, без какого-либо кода настройки, достаточно установить DisplayStyle вашей колонке ComboBox:

enter image description here

+0

Это выглядит здорово, но есть способ, где я могу измените внешний вид ControlPaint.DrawComboButton, похоже, что это 3D Fixed. –

+0

Вы хотели, чтобы это было 3D. Не так ли? –

+0

На самом деле я хочу сделать вид на верхней части изображения, а ниже - то, что я получил. Изображение здесь: https://i.imgsafe.org/6467d94258.jpg –