2016-11-22 19 views
1

DataGridViewComboboxCellを3D固定スタイルのテキストボックスに似せるようにする予定でした。私はこのコードを使用してコンボボックスでそれを行うために管理:DataGridViewComboBoxColumnを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); 
     } 
    } 

残念ながら、私は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イベントを見つけましたが、このコードでどのように動作するのかわかりません。誰でも助けてくれますか?ありがとう!あなたはこれらの2つの設定を実行する必要がありDataGridViewComboBoxColumn 3Dスタイルを作成するには

答えて

1

:あなたはコンボボックスを自分でセルと3Dコンボボタンを描く描画する

  • コントロールを編集するコンボボックス用のビジュアルスタイルを無効にする必要があり

    1. これを行うには、 EditingControlShowingCellPaintイベントを処理するために

    [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

    また、任意のカスタマイズコードなしで、外見の下に作成するには、それはComboBoxにあなたのコラムのDisplayStyleを設定するだけで十分です:

    enter image description here

  • +0

    偉大に見えるが、どこ私ができる方法があることをControlPaint.DrawComboButtonの外観を変更すると、3D固定のように見えます。 –

    +0

    3Dにしたかったのです。あなたはしませんでしたか? –

    +0

    私は実際に画像の上の1つの外観をしたい、下の1つは私が得たものです。ここの画像:https://i.imgsafe.org/6467d94258.jpg –

    関連する問題