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