2009-07-10 8 views
3

Ich habe eine VB.NET (2005) -Anwendung von meinem Chef, der eine über 100 Eingabe-und Display-Steuerelemente (Textboxen, Comboxes, etc.), viele mit zugeordneten Etiketten verwendet. Mein Chef hat mich gebeten, die Tab-Reihenfolge zu setzen und dann den Tastendruck zu speichern, damit der Benutzer mit enter die Steuerelemente navigieren kann. Ich habe 2 Apps wie diese, um daran zu arbeiten.Mehrere Panels und Groupboxes und Tab-Reihenfolge Wartung

Für die Tab-Reihenfolge konnte ich nicht die View/TabOrder-Funktion verwenden, da es so viele blaue kleine Tabindex-Popups gibt, dass ich keine der Steuerelemente auf dem Formular zum Klicken sehen kann. Ich versuchte, mit Erfolg durch das Popup-Fenster zu klicken, aber es gab mir immer noch nicht die Tab-Reihenfolge, die ich wollte. Der Tab-Assistent, der mit CodeSMART geliefert wurde, gab mir nicht das gewünschte Ergebnis, also konnte ich es verwenden.

Die Steuerelemente dieser Benutzersteuerung sind auf viele Gruppen verteilt, die wiederum auf mehrere Splitcontainer-Panels verteilt sind. Die 1. Paneel im Hauptsplitcontainer hat 3 Hauptgruppenfelder, die über eine Toolstripbutton ausgewählt sind

Beispiel (die die gewünschte groupbox zu sichtbaren setzt und die anderen unsichtbaren drehen.):

Private Sub ShowMainPanel() 
    'Note: Panels are groupboxes 
    Me.MaterialPanel.Visible = False 
    Me.HaulPanel.Visible = False 
    Me.MainPanel.Visible = True 

End Sub 

Jede dieser Gruppenfelder enthalten mehr groupboxes, von denen jedes 1 bis 15 Steuerelemente enthält. Einige sind schreibgeschützt, andere benötigen Informationen vom Benutzer. Bei den erforderlichen Steuerelementen ist der Tabstopp auf "true" gesetzt.

Also habe ich MANUELL jedes der Hauptgruppenpanels tabindexes als 0 bis 2 gesetzt. Dann für das 1. groupbox (mainpanel), ich setze den Tabindex für jedes seiner Steuerelemente und Gruppenboxen, die darin enthalten sind. Bei den Steuerelementen außerhalb des Containertyps sind die Tabindexes auf 0 bis 25 gesetzt, und die Groupboxes (Untergruppen) im Mainpanel sind 26 bis 48. Ich ging dann zu jedem Steuerelement in diesen Untergruppen und legte den Tabindex für diese Steuerelemente fest 0 bis Control.count-1 für die Gruppe.

Zusammengefasst sehen meine Registerkarte Befehle wie folgt aus (abgekürzt):

mainPanel = 0 
    1st fields = 0.0 
    2ndfield = 0.1 
    3rd field = 0.2 
    1st group = 0.3 
    1st field in 1st grp1 = 0.3.0 
    2nd field in 1st grp1 = 0.3.1 
    2nd group = 0.4 
    1st field in 1st grp2 = 0.4.0 
    2nd field in 1st grp2 = 0.4.1 
materialPanel = 1 
    1st fields = 1.0 
    2ndfield = 1.1 
    3rd field = 1.2 
    1st group = 1.3 
    1st field in 1st grp1 = 1.3.0 
    2nd field in 1st grp1 = 1.3.1 
    2nd group = 1.4 
    1st field in 1st grp2 = 1.4.0 
    2nd field in 1st grp2 = 1.4.1 

Anmerkung: Ich habe nicht wirklich geben, zum Beispiel 1.4.0 für einen tabindex, aber 0 für die Steuerung, 4 für die Untergruppe und 1 für die Hauptgruppe.

Dann setze ich die Zorder über die Document Outline Panel basierend auf der Tab-Reihenfolge.

Sobald ich all dies getan hatte, konnte ich endlich die Tab-Reihenfolge bekommen, die ich für das Mainpanel arbeiten wollte.

Aber wenn ich das gleiche auf die anderen 2 groupboxes (materialPanel und holpanel) anwendete, werden die Registerkarten vollständig ignoriert. Tab funktioniert überhaupt nicht in der App. für die 2. bis Hauptgruppenbox (MaterialPanel und HaulPanel). Die App ist die Control Library, daher benutze ich beim Debuggen den eingebauten UserTestContainer, und wenn eine der 2. 2 Groupboxes angezeigt wird, verschiebt die Tab-Taste den Fokus aus der App und in den Testcontainer.

Dies geschieht nicht in der 1. Groupbox (MainPanel). Es funktioniert gut.

Das Einstellen dieser Sachen dauerte ca. 3-4 Stunden zu langwieriger Arbeit. Aufgrund der Anzahl der Steuerelemente ist es schwierig, mit dieser Anwendung zu arbeiten. Bei jeder Änderung am Formular-Designer dauert die Verarbeitung 15 bis 20 Sekunden.

Hat jemand eine Ahnung, was hier vor sich geht?

Antwort

0

Es klingt wie die Groupboxes den letzten Registerkarte Index auf dem Formular werden zugewiesen werden, so dass die nächste praktikable Option für Eingabefokus ist die Form selbst, die die Testbehälter in diesem Fall ist.

Können Sie das KeyPreview Ereignis erfassen nur? Brechen Sie den Tastendruck ab und verwenden Sie dann nur eine intern gepflegte Sammlung der Reihenfolge der Steuerelemente, um den Fokus zu erhalten. Angesichts der Anzahl der Kontrollen scheint es, als ob Sie das meiste im Code sowieso tun sollten. Die Wartung wird viel einfacher, wenn Sie die .Controls -Eigenschaft des Groupbox/Panel verwenden und den Fokus behandeln, indem Sie über diese Sammlung iterieren und genau das gewünschte Steuerelement finden.

+0

Die Usercontrol behandelt nicht die Keypreview Ereignis alle an. Ich bin vielleicht in der Lage, eine späte Bindung zu machen, nachdem ich herausgefunden habe, "wer" der Elternteil sein wird, aber ich bin mir nicht sicher, ob das funktionieren wird. Beste, was ich tun kann, ist ein generischer KeyPress-Ereignishandler hinzufügen, die ich eine Tab-Taste können senden, wenn eine Return-Taste gedrückt wird, aber jede Kontrolle mußte in den Griff Liste aufgeführt werden. Ich musste 4 oder 5 separate KeyPress-Ereignisse erstellen, um es halbwegs lesbar zu halten. Meine Zwischenlösung war jede Kontrolle nummerieren, einschließlich Container, mit einem einzigartigen tabindex in Ordnung, die zu funktionieren scheint. Aber ich hätte gedacht, dass meine ursprüngliche Lösung funktionieren würde. – Marshall

+0

Wenn Sie Schlüsselereignisse in einem benutzer Kontrolle erfassen schauen Sie in die 'ProcessCmdKey überschrieben()'. – K3N