2009-05-05 9 views
0

Ich habe einen Dialog mit Lasten der Steuerung drin. Jedes und jedes Steuerelement wird während der Ladesequenz ausgefüllt und es kann eine Weile dauern, bis es vollständig gefüllt ist. Mean while, I nicht wollen den Benutzer auf eine der Steuerelemente klicken können. Mit anderen Worten, ich möchte das Steuerelement deaktivieren, um die Ereignisse zu empfangen, und ich möchte die Steuerelemente nicht deaktivieren (weil es seltsam aussehen könnte). Außerdem möchte ich die regelmäßigen Intervalle nicht abonnieren und abbestellen. Gibt es eine Möglichkeit, die Steuerelemente daran zu hindern, die Ereignisse für eine kurze Zeit zu hören?Deaktivieren eines Steuerelements aus dem Empfang eines Ereignisses in C#

Sudarsan Srinivasan

+1

Sie möchten die Steuerelemente nicht als deaktivieren Sie sagen, dass es seltsam aussehen wird, aber ist es nicht merkwürdiger, wenn Sie Steuerelemente aktiviert haben, die beim Klicken überhaupt nichts tun? –

Antwort

1

Leider ist der einzige Weg, den ich kenne, ist eine Klassenvariable haben (genannt etwas wie _loading) und in jeder Handler Steuerung so etwas wie:

If (! _loading) 
{ 
    ... 
} 

Und in Ihrem Laden Code Setzen Sie _loading = true;, sobald Sie fertig geladen haben.

2

Der einfachste Weg ist, die Kontrollpopulation aus dem Load-Event zu entfernen (wenn möglich). Dann laden so etwas wie:

private bool _LoadComplete; 

void OnFormLoad(Object sender, EventArgs e) 
{ 
    _LoadComplete = true; 
    InitializeControls(); 
    _LoadComplete = false; 
} 

void InitializeControls() 
{ 
    // Populate Controls 
} 

void OnSomeControlEvent() 
{ 
    if (_LoadComplete) 
    { 
     // Handle the event 
    } 
} 

bearbeiten ein paar andere Ideen:

  • Stellen Sie den Application.Cursor = Waitcursor (wird in der Regel Klicken nicht zulassen, aber keine 100% ige Garantie)
  • Erstellen Sie ein "Spinner" -Steuerelement, um den Benutzer wissen zu lassen, dass der Bildschirm beschäftigt ist. Beim Laden bringen Sie es nach vorne, damit es oben sitzt und alle anderen Bedienelemente abdeckt. Sobald Sie Sie es sichtbar = false getan Laden und zeigen Sie Ihre andere Steuerelemente
+0

Ja. Ich habe auch die gleiche Lösung. Hier ist, was ich getan habe, 1. Plazierte ein Panel über alle anderen Bedienelemente 2. machte das Panel transparent durch Überschreiben der ExStyle und CreateParams Eigenschaften des Steuerelements 3. Kontrollierte die Sichtbarkeit des Panels während des Betriebs Danke für die Vorschläge –

0

Wenn Sie nur eine Benutzereingabe deaktivieren möchten, dann können Sie die Enabled Eigenschaft auf false des Formulars festgelegt.

Dies hat den Effekt, dass Benutzereingaben für alle Steuerelemente des Formulars gesperrt werden, ohne dass das Erscheinungsbild der Steuerelemente geändert wird. Es ist die Technik, die intern von der ShowDialog Methode verwendet wird.

+0

Leider ist meins eine Benutzerkontrolle.Der gesamte Dialog eines Benutzersteuerelements, das auf einem übergeordneten Formular gehostet wird –

4

Der ganze Sinn der Deaktivierung von Steuerelementen besteht darin, dem Benutzer mitzuteilen, dass das Steuerelement zu einem bestimmten Zeitpunkt nicht verwendet werden kann. Dies ist eine Konvention, die Benutzer gelernt haben und daran gewöhnt sind, also würde ich empfehlen, das zu befolgen. Wenn Sie das nicht tun, können Sie die Benutzer verwirren.

Die einfachste Möglichkeit besteht darin, den Container zu deaktivieren, in dem sich die Steuerelemente befinden, anstatt jedes Steuerelement zu deaktivieren. Ein besserer Weg (oder wenigstens die Art, wie ich es vorziehe) ist eine Methode, die die Eigenschaften der Steuerelementeund Enabled basierend auf dem Status der Benutzeroberfläche steuert.

Verwandte Themen