“創建窗口句柄時出錯”的問題


今天用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這個控件,就不會出現問題(雖然我在其他頁面也用的這個控件,就沒出現問題)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM