“创建窗口句柄时出错”的问题
今天用MDI窗体,在一个子窗体A中,通过主窗体的下拉菜单调用另外一个子窗体B,出现错误“创建窗口句柄时出错”,原因不清楚;似乎与该子窗体A用了DotNetBar控件的DataGridViewX控件有关,我换成C#自带的DataGridView控件,就没在出现该问题。
有意思的地方在于:如果DataGridViewX控件里边没有数据,则不会出现问题;如果有数据,则出现。而且如果是进入窗体即查询出来的数据,也不会出现问题,非要是进入窗体后,刷新过滤出来的数据,才会出现问题。
目前发现的解决方案发现有三个:
1.在第二个子窗体B里,后台代码添加下边方法,重绘创建句柄的方法。
protected override void CreateHandle()
{
if (!IsHandleCreated)
{
try
{
base.CreateHandle();
}
catch { }
finally
{
if (!IsHandleCreated)
{
base.RecreateHandle();
}
}
}
}
不过该方法从表面看是解决了,但实际上并没有完全解决问题,当你关闭打开的子窗体B的时候,发现后台子窗体排列是有问题的。
2.将主窗体的构造函数里的自定义方法都移开,即主窗体的方法只保留默认的 InitializeComponent()方法,其他函数方法都移开(可以移动到load事件里),问题完全解决。原理不清楚。
使用该方法后,第一次不出现该问题,后来莫名其妙的又出现了,不过我同事和我用的一样的代码,他就没有再出现该问题。
3.在代码里添加
dataGridViewX1.SuspendLayout();//临时挂起控件的布局逻辑
我是放在本子窗体A的所有样式都设置完成后,即作为Shown事件的最后一段代码。当然放在别的地方也可以,但是如果样式没有设置完成就执行该代码,会出现样式没有变化的情况。
最好的办法就是不用DotNetBar的DataGridViewX这个控件,就不会出现问题(虽然我在其他页面也用的这个控件,就没出现问题)。