在大多数这些线程中发现的普遍共识是我的应用程序没有正确处理各种控件。但是,对我来说并非如此。
据我所知,这些价值观似乎都没有异常。此外,当我尝试加载表单时出现此错误。它由一个具有约 28 个节点的 DotNetBar AdvTree 组成。其中 26 个有 2 个单元格,第二个单元格有一个使用 DotNetBar TextBoxX 的托管控件。如果我加载更少数量的节点,错误就会消失。
我错过了什么吗?我相当肯定处置对象不是问题,因为我在加载表单时遇到了这个问题。
这是堆栈跟踪:
System.ComponentModel.Win32Exception (0x80004005): Error creating window handle.
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.ControlCollection.Add(Control value)
at DevComponents.AdvTree.AdvTree.Ú›()
at DevComponents.AdvTree.AdvTree.Ú“(Rectangle Ú‘, Rectangle Ú’)
at DevComponents.AdvTree.AdvTree.Ú()
at DevComponents.AdvTree.AdvTree.RecalcLayout()
at DevComponents.AdvTree.Node.OnDisplayChanged()
at DevComponents.AdvTree.Cell.OnSizeChanged()
at DevComponents.AdvTree.Cell.HostedControlSizedChanged(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnSizeChanged(EventArgs e)
at System.Windows.Forms.Control.UpdateBounds(Int32 x, Int32 y, Int32 width, Int32 height, Int32 clientWidth, Int32 clientHeight)
at System.Windows.Forms.Control.UpdateBounds()
at System.Windows.Forms.Control.WmCreate(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
at System.Windows.Forms.TextBox.WndProc(Message& m)
at DevComponents.DotNetBar.Controls.TextBoxX.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
回答:
对于自定义控件,有一个 Hosted Control 属性。我创建的对象的顺序是这样的:
- 创建节点
- 创建一个单元格
- 创建托管控件
- 将单元格的托管控件属性设置为步骤 3 中的控件。
- 将单元格添加到 node.Cells 集合
- 将节点添加到树中。
由于在第 4 步中,单元格没有父单元,它基本上就在那里。我的猜测是托管控件和单元格都没有父控件,因此它无法正确定位这些控件。无论哪种方式,我都需要将托管控件的父级设置为表单。这似乎解决了我的问题:
Hosted Control ctrl.Parent = this;