2016-05-16 115 views
0

我是一位相當有經驗的WinForms開發人員。我有一個曾經運行良好的MdiApplication。但是,最近我們使用ComponentOne RibbonForm的應用程序的主要外殼已經得到了很大的更新。此更新確實影響了我們的其他第三方組件,我們建立的組件是由於ComponentOne在其事件代碼中使用DoEvents()。我想我已經清理了所有的代碼引起的問題,但我現在已經找到了另一個......WinForms MdiChildren選擇和激活

當我有多個MdiChildren開放,並通過

從帶狀窗體上的按鈕,點擊事件代碼中選擇其中之一
document.Activate(); 
document.EditorControl.Select(); 
document.EditorControl.Focus(); 

另一個打開MdiChildren文件仍然有焦點,它的形式突出顯示,輸入沒有設置在我在代碼中設置的文檔上。兩個問題:

  1. 我怎樣才能確保Form我要激活是一個是活躍的?

  2. 鏈接到上面;使用form.Activate()將一個窗體設置爲活動狀態應該禁用其他窗口MdiChildren,但它不是 - 如何禁用代碼中的其他窗口?

謝謝你的時間。

+0

你的第一個問題讓我感到困惑......在什麼情況下有多於一個活躍的孩子? MDI的行爲就是做你想要的東西,所以任何其他的行爲似乎都是人爲的。 – DonBoitnott

+0

我可以打開多個excel工作簿,因此我可以在任何時候都有許多mdi兒童活動。用戶可以通過一個按鈕(如水平對齊或任何其他)按照自己的意願進行操作。我放置了這些項目,我想在佈局操作後恢復活動窗口。現在,出於某種原因,當我這樣做時,我得到了兩個活動窗口,最後一個是我編程移動的,另一個是我在操作之後設置的窗口。 'form.Active()'應該將'form'設置爲活動狀態,並且默認行爲,其他應該停用,這不會發生。爲什麼? – MoonKnight

+0

我現在遇到了'C1Ribbon'和一個MDI表單的問題,我懷疑這是由於他們使用'DoEvents()'。你能否擴展你發現導致你麻煩的事情? – DonBoitnott

回答

1

[過長評論]

我生病與戰鬥C1的後牙。 ESP。絲帶。我已經證實他們的支持,他們確實使用DoEvents(),他們用它們在桂線上產生。我現在要切換到DevExpress,這應該是直接爲我的MVC應用程序...

C1的使用DoEvents()弄亂了正常的應用程序流。 DoEvents()是異步的,意味着它在應用程序實際處理任何未完成的事件之前終止,因此如果您在包含許多順序語句的過程中使用它,調用DoEvents()會在調用時造成巨大幹擾。這就是我認爲我們在執行MDI操作時所看到的,但我們無法確定沒有C1源代碼。

我希望這會有所幫助。