2014-07-01 106 views
0

我的窗體中有一個菜單欄和下面的空間來顯示我的控件。我的菜單欄中的其中一個按鈕是打印按鈕,打印當前位於用戶控件I中的圖形。如果圖形是打印按鈕的事件處理程序的窗體上我可能只是簡單地調用WinForms中的父窗體和子窗體用戶控件通信

graph.printing.print(true) 

它是不會在我的情況下工作,因爲圖是在控制,而不是形式。

如何與包含表單的用戶控件進行通信並在需要時訪問或傳遞其變量?我還在表單底部有一個狀態欄,這個狀態欄也需要從用戶控件中更新,但是如果我能夠幫助完成這一部分的話,我將能夠處理這個問題。請記住,我還有另一個用戶控件,我將添加到表單中,該表單還將包含一個圖形,當按下打印按鈕時,該圖形需要與第一個控件上的其他圖形相同的處理。我計劃把這兩個交換出來,所以我有一種形式一次顯示一個控件。

我從這個答案得到了這個想法:https://stackoverflow.com/a/18191630/2567273但經過進一步的研究,我找不到任何人詢問表單和它包含的控件之間的實際通信過程。

我認爲this answer已經接近我正在尋找的東西,但我認爲它引導我使用面板代替用戶控制。

輸入後我發現最接近我的問題的答案可能是this,但該問題有孩子撫養事件和家長迴應,而我有父母提高事件,父母必須從孩子獲得信息。

+0

無論從UC形式的需求應通過屬性或方法提供。當用戶點擊打印時,表單從控件獲取並打印**或**,因爲它顯然是由usercontrol管理的數據,只需在表單調用的UC上展示PrintGraph方法 – Plutonix

+0

然後如果您有另一個UC也有一張可以打印的圖表,您只需使用相同的方法或屬性即可實現該功能。對? – Luminous

+0

是的 - 您有這些用戶控制的原因:(理論上)它們是作爲管理和顯示foobar的專家而構建的。打印只是其中一項相關操作。卸載到表單可以工作,但可以是很多東西來回傳打印/處理/保存/上載的東西。由於表單是主機菜單,他的角色可以少得多該命令並將其傳遞給相關的演員。只是因爲表單確實有菜單,所以它不適合打印。 – Plutonix

回答

0

想想這個的一種方法是角色。據推測,你建立了這個UserControl來處理與圖形相關的數據的管理。因此,您可以在圖表專家的角色中思考他們。一旦你這樣做,印刷它們實際上只是它應該做的一件事。

另一方面,表單並不是特殊的,只是因爲它碰巧接收到用戶打印的命令。它在這個角色可能僅僅是知道聯繫哪個用戶控件和調用的方法:像ClearNewGraphSave和其他任何有幾分相同的方式

Sub PrintGraphMenuClick.... 

    Select Case something  ' determinant as to which UC to contact 
     Case operation.Foo 
      ucFoo.PrintGraph 

     Case operation.Bar 
      ucBar.PrintGraph 

其他菜單選項。這裏的表單角色可能是接收來自用戶的命令,並將其傳遞給正確的控件,調用正確的正確方法並傳遞正確的參數 - 這不是一項簡單的任務。

當然,用戶控件可以替代地實現ContextMenu,而不是直接接收這些命令,而不是MainMenu

很多時候將操作卸載到別的東西上會導致如此多的屬性,文件名,流等不得不從這裏移動到那裏變得很繁瑣。在這種情況下,它不像MainForm對於UserControl無法處理的打印機有一些特殊的功能。

+0

感謝您的評論!我知道現在該做什麼。我也會記住這個ContextMenu的想法。儘管如此,他並不熱衷於雙重否定。 – Luminous

+0

原本是爲了強調,但也有點匆忙。祝你好運 – Plutonix

0

只有一個正確的解決方案:

1)添加一個事件到你的用戶控件。

2)當用戶控件中發生特定「事情」時引發事件。

3)在表單代碼中附加一個處理程序到事件。

4)添加代碼以更新事件處理程序中的底部欄。

+0

這是我希望更新狀態欄的完美解決方案。謝謝。可悲的是,我的問題是問你如何讓表單交談,並讓「東西」脫離控制,並鬆散耦合,因爲我要有多個控件。 – Luminous

+0

請詳細說明「talk to」和「stuff」 – doker

+0

(所有這些都可以在我的問題btws中找到)在我的表單中我有一個菜單欄。其中一個菜單項是打印,即打印在表單內的控件中找到的圖形。我如何將圖形從控件傳遞到要打印的表單? – Luminous

相關問題