2009-09-07 52 views
5

我有一個DataGridView,我在其事件期間在每行的第一個單元格上繪製TreeView樣式的虛線。當第一個單元格(它是DataGridViewTextBoxCell)處於編輯模式時,不繪製線條。如何處理編輯控件的繪畫?標準編輯控件沒有Paint事件,如果我可以避免這樣做,我不想創建新類型的單元格。如何處理DataGridView的編輯控件的繪畫?

+0

我剛剛打一模一樣的問題,因爲你,而嘗試的類似Excel的字形添加到選定的單元格。使用編輯控件時,繪畫事件不會被調用。我目前正在調查使用PositionEditingPanel屬性來縮小編輯控件,以便它不會干擾父單元格中的字形。如果我破解它,我會回覆。 – Bryan 2009-09-19 12:31:57

+0

@Bryan:謝謝。 – Simon 2009-09-21 08:06:55

回答

0

嘗試處理DataGridView.CellPainting事件。

+0

沒有快樂 - 它被調用,但是當單元格處於編輯模式時它不會繪製任何可見的東西。 – Simon 2009-09-07 14:36:07

2

我通過創建一個自定義單元格類型並按照Bryan描述的方式縮小了編輯控件來解決了類似的問題。這不是非常困難,而且這是我意識到保持編輯控制不受任何東西影響的唯一方式。

像這樣的東西應該爲你工作:你的第一列從左

public class PaintAccommodatingTextBoxCell : DataGridViewTextBoxCell 
{ 
    // Adjust the editing panel, so that custom painting isn't 
    // drawn over when cells go into edit mode. 
    public override Rectangle PositionEditingPanel(Rectangle cellBounds, Rectangle cellClip, DataGridViewCellStyle cellStyle, bool singleVerticalBorderAdded, bool singleHorizontalBorderAdded, bool isFirstDisplayedColumn, bool isFirstDisplayedRow) 
    { 
     // First, let base class do its adjustments 
     Rectangle controlBounds = base.PositionEditingPanel(cellBounds, cellClip, cellStyle, singleVerticalBorderAdded, singleHorizontalBorderAdded, isFirstDisplayedColumn, isFirstDisplayedRow); 

     // Shrink the bounds here... 

     return controlBounds; 
    } 
} 

public class PaintAccommodatingTextBoxColumn : DataGridViewTextBoxColumn 
{ 
    PaintAccommodatingTextBoxCell templateCell; 

    public PaintAccommodatingTextBoxColumn() 
    { 
     templateCell = new PaintAccommodatingTextBoxCell(); 
    } 

    public override DataGridViewCell CellTemplate 
    { 
     get 
     { 
      return templateCell; 
     } 
     set 
     { 
      PaintAccommodatingTextBoxCell newTemplate = value as PaintAccommodatingTextBoxCell; 
      if (newTemplate == null) 
       throw new ArgumentException("Template must be a PaintAccommodatingTextBoxCell"); 
      else 
       templateCell = newTemplate; 
     } 
    } 
} 
+0

在處理同一問題時,我發現在調用base.PositionEditingPanel之前需要修改cellBounds參數,而不是簡單地修改返回值。否則,EditingControl將被調整大小,但不會影響自定義單元格繪製的EditingPanel。 – asponge 2010-04-06 17:20:00

3

首先設置單元格邊距爲16,所以在查看模式或編輯模式,內容會通過給定的填充顯示。

this.dataGridView1.Columns[0].DefaultCellStyle.Padding= new Padding(16,0,0,0); 

然後處理CellPainting事件,並做這些步驟:

  1. 只畫第一列的rowIndex應> = 0,以避免渲染列標題
  2. 油漆你的樹紋或任何你想
  3. 使用e.Handled = true取消默認繪畫

這裏是代碼:

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
{ 
    //Only paint rirst column and RowIndex should be >=0 to avoid rendering column header 
    if (e.ColumnIndex == 0 & e.RowIndex >= 0) 
    { 
     //Paint your tree lines or whatever you want 
     using (var treePen = new Pen(Color.Gray, 1)) 
     { 
      treePen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; 
      e.Paint(e.CellBounds, DataGridViewPaintParts.All); 
      e.Graphics.DrawLine(treePen, 
       new Point(e.CellBounds.Left + 4, e.CellBounds.Top), 
       new Point(e.CellBounds.Left + 4, e.CellBounds.Bottom)); 

      e.Graphics.DrawLine(treePen, 
       new Point(e.CellBounds.Left + 4, e.CellBounds.Top + e.CellBounds.Height/2), 
       new Point(e.CellBounds.Left + 12, e.CellBounds.Top + e.CellBounds.Height/2)); 
     } 

     //Cancel default painting using e.Handled = true 
     e.Handled = true; 
    } 
} 

,這裏是截圖:

enter image description here

+1

我希望我能接受它。 – 2015-08-25 17:05:25