我有一個DataGridView
,我在其事件期間在每行的第一個單元格上繪製TreeView樣式的虛線。當第一個單元格(它是DataGridViewTextBoxCell
)處於編輯模式時,不繪製線條。如何處理編輯控件的繪畫?標準編輯控件沒有Paint事件,如果我可以避免這樣做,我不想創建新類型的單元格。如何處理DataGridView的編輯控件的繪畫?
回答
嘗試處理DataGridView.CellPainting事件。
沒有快樂 - 它被調用,但是當單元格處於編輯模式時它不會繪製任何可見的東西。 – Simon 2009-09-07 14:36:07
我通過創建一個自定義單元格類型並按照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;
}
}
}
在處理同一問題時,我發現在調用base.PositionEditingPanel之前需要修改cellBounds參數,而不是簡單地修改返回值。否則,EditingControl將被調整大小,但不會影響自定義單元格繪製的EditingPanel。 – asponge 2010-04-06 17:20:00
首先設置單元格邊距爲16,所以在查看模式或編輯模式,內容會通過給定的填充顯示。
this.dataGridView1.Columns[0].DefaultCellStyle.Padding= new Padding(16,0,0,0);
然後處理CellPainting
事件,並做這些步驟:
- 只畫第一列的rowIndex應> = 0,以避免渲染列標題
- 油漆你的樹紋或任何你想
- 使用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;
}
}
,這裏是截圖:
我希望我能接受它。 – 2015-08-25 17:05:25
- 1. C#datagridview的編輯控制
- 2. 如何處理C#datagridview中自定義類型的編輯?
- 3. 關於datagridview控件的事件處理
- 4. 在編輯時處理dataGridView FormatExeption
- 5. 如何處理Win32多行編輯控件中的Enter鍵?
- 6. 如何獲取datagridview/datagridviewcell的編輯控件?
- 7. 如何處理空的datagridview?
- 8. 繪畫DataGridView行
- 9. 如何處理DataGridView列中的條件?
- 10. 繪圖畫布編輯器
- 11. 如何使用所有者繪製的豐富編輯控件
- 12. VB.NET Class方法處理繪畫事件
- 13. 錯誤處理的jQuery插件編輯
- 14. 如何在已處理的控件中繪製位圖
- 15. 如何驗證DataGridView中單元格的編輯控件的輸入?
- 16. 如何以編程方式編輯datagridview?
- 17. 處理編輯NSTableView
- 18. 如何控制/處理/編輯多個對象?
- 19. datagridView編輯
- 20. 如何編輯批處理文件中的字符串
- 21. 如何處理觸動編輯按鈕(UITableView)的事件?
- 22. 如何在批處理文件中編輯選擇的答案?
- 23. 如何編輯ExecutionContext彈簧批處理
- 24. 如何處理來自DataGridView的錯誤
- 25. 如何處理datagridview中的標識列?
- 26. Qt:如何繪製虛擬行編輯控件
- 27. 檢測哪個列顯示在datagridview中的編輯控件
- 28. VB.Net檢測datagridview編輯控件上的SHIFT鍵
- 29. 帶彈出編輯器的自定義DataGridView控件
- 30. 驗證DataGridView中的自定義編輯控件
我剛剛打一模一樣的問題,因爲你,而嘗試的類似Excel的字形添加到選定的單元格。使用編輯控件時,繪畫事件不會被調用。我目前正在調查使用PositionEditingPanel屬性來縮小編輯控件,以便它不會干擾父單元格中的字形。如果我破解它,我會回覆。 – Bryan 2009-09-19 12:31:57
@Bryan:謝謝。 – Simon 2009-09-21 08:06:55