“创建窗口句柄时出错”的问题

今天用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这个控件,就不会出现问题(虽然我在其他页面也用的这个控件,就没出现问题)。

posted @ 2013-09-26 15:26  九天星辰  阅读(14774)  评论(0编辑  收藏  举报