Position von Control auf Form ermitteln

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Position von Control auf Form ermitteln

    Guten Morgen liebe Community,

    ich hatte ursprünglich nach einer Möglichkeit gesucht, von einem TabControl einzelne Tabs zu deaktivieren (Enabled = false), bin da aber nicht fündig/mit zufrieden geworden...

    Also wollte ich eine weitere Möglichkeit ausprobieren:
    Das TabControl wird auf Enabled = false gesetzt, sodass der Benutzer grundsätzlich keine Tabs wählen kann.
    Der Benutzer soll aber dennoch in der Lage sein, Tabs auswählen zu können.
    Also dachte ich mir, ich gehe über das Form-MouseDown-Event, schaue mir die Cursor-Position an und vergleiche, ob sich diese Position im TabRectangle des gewünschten Tabs befindet.

    Das TabRectangle bekomme ich hiermit:

    C#-Quellcode

    1. Rectangle tabRect = tcMain.GetTabRect( tcMain.TabPages.IndexOf( tpAbout ) );


    Nur bekomme ich das Umrechnen der Position vom TabRect auf die Form-Koordinate nicht wirklich hin :/
    Habe mit RectangleToClient etc. experimentiert, allerdings liegt die geklickte Positionen damit immer außerhalb des TabRects ||

    Habt Ihr ne' Idee?
    Klingt nach Pfeil-Rücken-Brust-Auge. Das Setzen von Enabled einer TabPage deaktiviert nur den Inhalt. Wenn es darum geht, die TabPage nicht anwählen zu können, dann:

    VB.NET-Quellcode

    1. Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
    2. If e.TabPage Is TabPage2 Then e.Cancel = True
    3. End Sub
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Doch hat sie.

    EDIT: Hab gerade ausprobiert, Enabled funktioniert gar nicht.

    VB.NET-Quellcode

    1. Dim CurrentTab As TabPage = TabControl1.TabPages(e.Index)
    2. CurrentTab.Enabled = False



    mit Location kann die Position ermittelt werden

    VB.NET-Quellcode

    1. CurrentTab.Location


    mit GetTabRect die Abmasse der Tabs

    VB.NET-Quellcode

    1. Dim ItemRect As Rectangle = TabControl1.GetTabRect(e.Index)


    etc.

    Freundiche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    TRiViUM schrieb:

    M.m.n. hat eine TabPage keine Property Enabled

    Mein IntelliSense hat es mir nur nicht vorgeschlagen, hab ich gerade bemerkt...und auch festgestellt, dass es nicht funktioniert :huh:

    exc-jdbi schrieb:

    mit GetTabRect die Abmasse der Tabs

    Ja, soweit war ich quasi auch schon, nur verstehe ich nicht, wie ich die Position der Maus auf die Form anwenden kann, um festzustellen, ob auf ein TabRect geklickt wurde, oder eben nicht.
    Klappt bei mir:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. 'TabControl1.TabPages(1).Enabled = False
    3. 'oder
    4. TabPage2.Enabled = False
    5. End Sub
    Bilder
    • DisabledTabPage.png

      2,7 kB, 549×154, 70 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Jo, bei mir jetzt auch.
    Hatte es in's bestehende Projekt eingebunden und noch an einer anderen Stelle überschrieben :rolleyes:

    Okay, dann hat sich das Thema damit für mich erledigt, danke ^^

    BTW: Gibts eigentlich eine Erklärung dafür, wieso mir VS im IntelliSense das Enabled nicht bei der TabPage auflistet?
    Bilder
    • MissingEnabled.png

      4,23 kB, 326×128, 62 mal angesehen
    Jo funkst tatsächlich, wenn ich das bei mir einbaue und das DrawItem-Event nutze.

    VB.NET-Quellcode

    1. Me.TabControl1.DrawMode = TabDrawMode.OwnerDrawFixed


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Jo, manche Control-Member sind so attributiert, dass sie in Intellisense nicht auftauchen. Das ist Absicht, wenn MS nämlich meint, es sei nicht sinnvoll, die zu benutzen.
    Vielleicht meine MS in diesem Fall, dass es inkonsistend aussehen täte, wenn man eine TabPage disablen kann, aber trotzdem noch anwählen.
    @ErfinderDesRades Jou.
    Wenn ich TabPages nicht anzeigen will, entferne ich sie aus der TabPages-Collection.
    Wenn sie wieder erforderlich sind, füge ich sie wieder hinzu.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    geht das?
    Nein.
    Die bleibt doch in einer Variable gespeichert, die natürlich nicht disposed werden darf.
    Beim Anlegen wird doch auch zuerst eine Variable generiert, die dann der Tab-Collection hinzugefügt wird.

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    @ErfinderDesRades Jou, so isses.
    Ich hab eben noch mal nachgesehen, ich nehme die Pages nur raus.
    Wenn weitere Pages hinzugefügt werden sollen, werden die explizit erstellt.
    Das mach ich bei unseren Hardware-Konfiguratoren, wo der Administrator erweiterte Möglichkeiten hat.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades Jetzt hab ich es gefunden:

    C#-Quellcode

    1. this.tabControl1.TabPages.Clear(); // leert nur die Collection, die TabPages bleiben erhalten
    2. this.tabControl1.TabPages.Add(this.tc1); // die Collection mit den erforderlichen Pages neu aufbauem
    3. this.tabControl1.TabPages.Add(this.tc3);
    4. this.tabControl1.TabPages.Add(this.tc5);

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    und wenn du deine controls innerhalb des tabpages auf ein ControlPanel packst und das dann einfach auf enabled = false setzt?
    Ich meine gelesen zu haben, das man damit alle Controls automatisch deaktiviert...

    oder mit sowas arbeiten?
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Eine TabPage ist eine ContainerBox wie ein Panel. Verhalten daher diesbezüglich identisch.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.