treegridview
For all those getting the error:
"Unable to cast object of type 'System.Windows.Forms.DataGridViewTextBoxCell' to type 'AdvancedDataGridView.TreeGridCell'."
If you legitimately want to have a textbox column in front of the TreeGridColumn make the following change.
In TreeGridNode.cs at line 262 (Or find the following statement:
<---
if (cell.GetType().IsAssignableFrom(typeof(TreeGridCell)))
<---
Replace it with this if statement:
<---
if (cell.GetType().Equals(typeof(TreeGridCell)))
<---
The problem is the TreeGridColumn was inherited from the texBoxColumn so the original statement was giving a false positve.
Hope it helps.
Dear Mark,
thanks for sharing this. As others pointed out already, expanding nodes becomes utterly slow even for just a few hundred nodes.
The problem lies in changing the CellStyle Padding in TreeGridCell.cs line 106.
Changing this seems to rebuild the geometry of the entire tree. But the Padding is not used in the base code but only in the overridden Paint method.
Thus an easy solution to speed up this widget is to introduce your own Padding field. This works fine as the vertical padding keeps constant and thus changes do not affect other cells.
Best Regards
Matthias
Hi Mark,
Thank you for this great control. As far as the slow performance caused by setting the Padding goes (thanks for identifing the problem Matthias!), one easy solution is to calculate the padding inside OnPaint().
This is what I did roughly:
TreeGridCell.cs in function OnPaint():
replaced
Rectangle glyphRect = new Rectangle(cellBounds.X + this.GlyphMargin, cellBounds.Y, INDENT_WIDTH, cellBounds.Height - 1);
with
_lastKnownGlyphRect = new Rectangle(cellBounds.X + this.GlyphMargin, cellBounds.Y, INDENT_WIDTH, cellBounds.Height - 1);
and moved the call just before base.OnPaint().
Added
cellStyle.Padding = new Padding(_lastKnownGlyphRect.Right+_imageWidth, 0, 0, 0);
just before calling base.OnPaint().
Naturally, I hashed out setting this.Style.Padding at the end of UpdateStyle(). And I had to change OnMouseDown() and replace
if (e.Location.X > this.InheritedStyle.Padding.Left)
with
if (e.Location.X > _lastKnownGlyphRect.Right || e.Location.X < _lastKnownGlyphRect.Left)
Works much faster with larger number of elements now. :) Just be careful when using my code, I haven't tested it thoroughly yet. :P
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
2005-08-06 开放式并发冲突检测的四种方法(希望补充)