2016-12-12 1 views
0

Ich mache eine Anwendung, wo ich ein TabControl und einige Steuerelemente, die ich erstellen möchte. Also habe ich eine Funktion, die im Grunde Kontrollen und eine Textbox macht. Der Code sieht so aus:Textfeld Eingabe hängt die Benutzeroberfläche in Winforms C#

TextBox message_box = new TextBox(); 
message_box.Size = new Size(790, 38); 
message_box.Location = new Point(9, 7); 
message_box.Font = new Font("Microsoft Sans Serif", 20); 
message_box.KeyDown += Message_box_KeyDown; 
message_box.Enter += Message_box_Enter; 
bottom_panel.Controls.Add(message_box); 

Ich habe auch einige andere Steuerelemente hinzugefügt, aber diese spezielle Steuerung ist diejenige, mit der ich Probleme habe. Weil, wenn ich diese Steuerelemente der Registerkarte hinzufüge, und dann ich die Registerkarte der Tabsteuerung hinzufüge, geschieht etwas Merkwürdiges.

Jedes einzelne Steuerelement in der hinzugefügten Registerkarte funktioniert einwandfrei und ohne Verzögerung. Aber wenn ich die TextBox eintippe, bekomme ich massive Verzögerung und es friert ein. Dies passiert auch, wenn ich der Designer-Seite im TabControl auch ein Textfeld hinzufüge.

Dies ist das Ereignis, das ausgelöst wird:

private async void Message_box_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == Keys.Enter) 
    { 
     string name = ""; 
     this.Invoke(new MethodInvoker(delegate { name = tabControl1.SelectedTab.Name; })); 
     TextBox box = new TextBox(); 
     this.Invoke(new MethodInvoker(delegate { box = (TextBox)sender; })); 
     if (box.Text.Length > 0) 
     { 
      uiControls.ListItem melding = await Task.Factory.StartNew(() => sendMelding(name, box.Text)); 
      box.Clear(); 
     } 
    } 
} 

Ich weiß nicht, was falsch ist, ich tue und wie die Textbox machen hinken zu stoppen. Ich habe versucht zu prüfen, ob es Aufrufen benötigt, ich habe versucht, Anrufung. Ich habe auch diesen Code verwendet, die CreateParams in Form owerwriting:

protected override CreateParams CreateParams 
{ 
    get 
    { 
     // add the drop shadow flag for automatically drawing 
     // a drop shadow around the form 
     CreateParams cp = base.CreateParams; 
     cp.ExStyle |= 0x02000000; 
     cp.ClassStyle |= CS_DROPSHADOW; 
     return cp; 
    } 
} 

Um klar zu sein, die KeyDown Funktion keinen Treffer auf die Leistung hat, wird der Code innerhalb der KeyDown- Funktion nicht gefeuert jedes Mal wenn ich schreibe, seine einzige gefeuert, wenn ich Enter drücke. aber normalerweise, wenn ich über 2-3 Zeichen in das Textfeld schreibe, erscheint das lagg und das Programm friert ein, wenn ich die Ereignisse entferne, geschieht es auch.

+0

Welche Funktion hat 'sendMelding'? es ist notwendig, 'sendMelding' Methode jedes Mal aufzurufen, wenn Ihr Textfeld Daten enthält? –

+0

Schlägt die Eingabe nur nach, wenn Sie die Eingabetaste oder bei jedem Tastendruck drücken? – krillgar

+0

Haben Sie die Verzögerung, auch wenn Sie das KeyDown-Ereignis ** nicht ** aufrufen? – Vikhram

Antwort

1

Ich vermute, dass die Verzögerung auftritt, weil Sie auf die Aufgabe warten, bevor Sie fortfahren. Das heißt, Sie haben:

if (box.Text.Length > 0) 
{ 
    uiControls.ListItem melding = await Task.Factory.StartNew(() => sendMelding(name, box.Text)); 
    box.Clear(); 
} 

Der Aufruf von box.Clear nicht ausgeführt werden, bis die Aufgabe abgeschlossen ist.

Es ist schwer zu sagen, wie Sie das beheben würden, weil ich nicht weiß, was Sie hier erreichen wollen.

Auch müssen Sie Ihre Verwendung von Invoke in dieser Methode überprüfen. Sie haben einige Fehler. Beispiel: Sie greifen auf box.Text.Length ohne Invoking zu, was bedeutet, dass Sie eine Ausnahme erhalten, wenn der Ereignishandler für einen Thread ohne Benutzeroberfläche aufgerufen wird.

+0

Der Code im KeyDown-Ereignis wird nur ausgelöst, wenn ich die Eingabetaste drücke. Aber die Verzögerung und das Einfrieren geschieht unabhängig mit oder ohne das Ereignis. – blueio22

+0

Ich bin mir auch der Ausnahme bewusst, die wegen des cross-thread-Aufrufs ausgelöst wird.Aber die Verzögerung und das Einfrieren der Textbox geschieht unabhängig von dem Ereignis und seinem Algorithmus. – blueio22

+0

Wenn Sie also den gesamten Code auskommentieren, der ausgeführt wird, wenn die Eingabetaste gedrückt wird, ist der Lag noch vorhanden? Wenn ja, dann ist vielleicht das 'KeyDown'-Ereignis nicht der Übeltäter und Sie sollten woanders nach dem Problem suchen. –