2009-11-27 13 views
6

Ich erstelle gerade ein leises Druckmodul. Das aktuelle Steuerelement, das ich verwende, stellt sicher, dass das Steuerelement bereits erstellt wurde (IsHandleCreated). Ich habe alles getan, um dies ohne Glück zu betrügen.Force Create Handle für Control

Haben Sie Ideen, wie ich ein Handle für die Steuerung erstellen kann, ohne auf dem Bildschirm angezeigt zu werden?

Antwort

4

Versuchen Sie, CreateParams Eigenschaft Getter zu überlasten. In ihm löschen Sie die WS_VISIBLE Flagge.

+1

Ich fand, dass this.CreateHandle(); funktioniert wirklich gut (aus dem Formular) – NewfrontSolutions

0

Ich löste dieses lästige Problem mit der Erstellung von Handles, indem ich WS_VISIBLE von CreationParams änderte. Sie können entweder die CreationParams-Eigenschaft von Control außer Kraft setzen oder die CreateHandle-Methode mit der entsprechenden CreateParams-Instanz aufrufen. Siehe die link

19

Sie müssen auf die Handle Eigenschaft zugreifen (das Ergebnis in eine Dummy-Variable oder etwas). Schau in Reflektor; Es erzwingt die Erstellung von Handles.

+0

Ha, es funktioniert. Guter Tipp! –

+0

Danke! Das funktioniert wie charm :) – Mnyikka

2

hatte ich das gleiche Problem mit einigen anderen Kontrollen und verwendet, um die Control.CreateControl() Methode:

private void CheckForExistingHandle(Control control) 
{ 
    if (!control.IsHandleCreated) 
     control.CreateControl(); 
} 

Aber ich weiß nicht, wie es mit einem Druckmodul arbeitet.

+5

Stellen Sie sicher, dass die visible -Eigenschaft des Steuerelements auf True festgelegt ist, oder das Handle nicht von einem CreateControl() - Aufruf erstellt wird. Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/system.windows.forms.control.createhandle%28v=VS.90%29.aspx. – Drahakar

+0

@Drahakar Das ist eine sehr gute Anmerkung: 'CreateControl' könnte das Steuerelement nicht erstellen. Die in MSDN notierte Problemumgehung besteht darin, auf die Eigenschaft ".Handle" zuzugreifen –

0

Aufruf der privaten Methode CreateHandle wird die Arbeit erledigen.

MethodInfo ch = frm.GetType().GetMethod("CreateHandle", BindingFlags.NonPublic | BindingFlags.Instance); 
ch.Invoke(frm, new object[0]);