Announcement

Collapse
No announcement yet.

C# this.size = new Size(width,height) verändert Form nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C# this.size = new Size(width,height) verändert Form nicht

    Hallo Entwickler,

    ich speichere die Größe meines Hauptformulars Benutzerbezogen auf einer Benutzertabelle des SQL Servers über das Ereigniss _SizeChanged, das funktioniert auch alles wunderbar.

    Speichern funktioniert- und auch die spätere abholung der Daten.

    Erst wenn ich die Daten dann wieder über

    [highlight=c#] private void UpdateWindowSize(string width, string height)
    {
    this.Size = new Size(Convert.ToInt32(width),Convert.ToInt32(height )) ;
    pnClientArea.Size = new Size(Convert.ToInt32(width), Convert.ToInt32(height));
    }[/highlight]setzen will, weigert sich die Applikation beharrlich, die Größe zu verändern. Zwar bekomme ich keinen Fehler- und beim debuggen erkenne ich auch, dass die Daten gesetzt werden, siehe:




    Jedoch erkennt man in der Applikation von der Größenänderung rein gar nichts.

    Könnt Ihr mir erklären, woran das liegt??

    Grüße
    Stephan...
    Zuletzt editiert von Freelancer; 31.10.2008, 08:11. Reason: Bild etwas verkleinert... Danke für den Tipp, Jürgen Thomas!

    "A fool with a tool is still a fool."

  • #2
    Hallo,

    hast Du StartPosition.Manual gesetzt? Ist FormBorderStyle auf Sizable* gesetzt?

    Übrigens sollte anstelle von Convert.ToXxx immer Parse, ParseExact, TryParse, TryParseExact verwendet werden. (Wenn Du Einstellungen speichern willst, solltest Du sie sowieso als int und nicht als string speichern.)

    Jürgen

    PS. Bitte achte künftig auf die Größe von Bildern und Codes. So breite Darstellungen stören das Lesen doch sehr.

    Comment


    • #3
      Originally posted by Jürgen Thomas View Post
      Hallo,

      hast Du StartPosition.Manual gesetzt? Ist FormBorderStyle auf Sizable* gesetzt?
      Hi Jürgen Thomas,

      jep, diese Properties sind gesetzt:


      Originally posted by Jürgen Thomas View Post
      Übrigens sollte anstelle von Convert.ToXxx immer Parse, ParseExact, TryParse, TryParseExact verwendet werden. (Wenn Du Einstellungen speichern willst, solltest Du sie sowieso als int und nicht als string speichern.)
      Ok, ich achte in Zukunft darauf.... Danke für den Tipp !!



      Originally posted by Jürgen Thomas View Post
      Jürgen

      PS. Bitte achte künftig auf die Größe von Bildern und Codes. So breite Darstellungen stören das Lesen doch sehr.
      Auch daran werde ich arbeiten....


      Weißt Du / Wisst Ihr zufällig, woran es noch scheitern könnte?

      Grüße
      Stephan

      "A fool with a tool is still a fool."

      Comment


      • #4
        Hallo Stephan,

        Weißt Du / Wisst Ihr zufällig, woran es noch scheitern könnte?
        Ich hätte wie Du erwartet, dass die Zuweisung von Size es automatisch erledigt. Aber vielleicht muss danach eine der folgenden Methoden ausgeführt werden: Invalidate, PerformLayout, Refresh.

        Jürgen

        Comment


        • #5
          Originally posted by Jürgen Thomas View Post
          Hallo Stephan,

          Ich hätte wie Du erwartet, dass die Zuweisung von Size es automatisch erledigt. Aber vielleicht muss danach eine der folgenden Methoden ausgeführt werden: Invalidate, PerformLayout, Refresh.

          Jürgen
          - Ne. Dat is es auch nicht. Weder Refresh, noch Invalidate oder PerformLayout hilft... sehr schade...

          Trotzdem Vielen Dank nochmals für deine vielen Ideen... :-)

          Grüße
          Stephan

          "A fool with a tool is still a fool."

          Comment


          • #6
            Also ich würde die Größe des Formulars nur beim Beenden in die Datenabnk schreiben, und mir die ständigen UPDATES während einer Größenänderung sparen.
            Ich kann das Problem noch nicht ganz nachvollziehen, da ich gerade ein einfaches Formular ber Button-klick geändert habe (sowohl mit Locked=true als auch mit false).
            Hast du die Paint() Methode überschrieben und vergessen den Vater aufzurufen?
            mit Invalidate() sollte das neu zeichnen lassen sonst Problemlos funktionieren.

            Und was ist pnClientArea? auch eine Form? dann müsste man natürlich pnClientArea.Invalidate() aufrufen (wenns kein Kind von this ist).
            Just be DRY and KISS your customers.

            Comment


            • #7
              Originally posted by Frischmilch View Post
              Also ich würde die Größe des Formulars nur beim Beenden in die Datenabnk schreiben, und mir die ständigen UPDATES während einer Größenänderung sparen.
              Ich kann das Problem noch nicht ganz nachvollziehen, da ich gerade ein einfaches Formular ber Button-klick geändert habe (sowohl mit Locked=true als auch mit false).
              Hast du die Paint() Methode überschrieben und vergessen den Vater aufzurufen?
              mit Invalidate() sollte das neu zeichnen lassen sonst Problemlos funktionieren.

              Und was ist pnClientArea? auch eine Form? dann müsste man natürlich pnClientArea.Invalidate() aufrufen (wenns kein Kind von this ist).
              Hi Frischmilch,

              Update, diesen Tipp bekam ich heute schonmal. Enthusiastisch habe ich die Funktion eingebaut:



              [highlight=c#]
              private void UpdateWindowSize(string width, string height)
              {
              try
              {
              this.Size = new Size(Convert.ToInt32(width), Convert.ToInt32(height));
              pnClientArea.Size = new Size(Convert.ToInt32(width), Convert.ToInt32(height));
              //pnClientArea.Invalidate();
              this.Invalidate();
              //pnClientArea.Update();
              this.Update();
              }
              catch (Exception ex)
              { Program.LogError("Fehler beim setzen der benutzerdefinierten Größe", ex); }
              }
              [/highlight]

              nur leider rührt sich die Applikation keinen Centimeter.
              pnClientArea ist ein Panel innerhalb des Formulars... dass im Code auskommentierte pnClientArea.Invalidate(); sowie pnClientArea.Update(); ist wohl auch nicht die Lösung... geht zumindest auch nicht...

              Muss ich evtl. mit Dispose arbeiten??

              @Frischmilch:
              Vielen Dank !!


              Grüße
              Stephan

              "A fool with a tool is still a fool."

              Comment


              • #8
                Hallo,
                1. da das Panel die gleiche Größe hat wie die Form kann dem Panel mit Dock = Fill die gleich Größe automatisch zugewiesen werden
                2. es wurde schon darauf hingewiesen dass es besser ist Width und Height als Integer und nicht als String zu verwenden
                3. du musst irgendwelche Nebeneffekte haben die uns bisher verheimlicht hast (oder selbst nicht weißt). Ich habe ein WinForm-Projekt erstellt mit einem Panel (Dock = Fill) einem Button der UpdateWindowSize aufruft. Die Größe wird dabei nach Zufallszahlen geändert -> funktioniert wunderbar, warum sollte es also bei dir nicht gehen? Es sei denn...die verheimlichten Nebeneffekte.


                Der Code aus meinem Testprojekt:
                [highlight=c#]
                using System;
                using System.Drawing;
                using System.Windows.Forms;

                namespace WindowsFormsApplication1
                {
                public partial class Form1 : Form
                {
                private Random _rnd = new Random();

                public Form1()
                {
                InitializeComponent();
                }

                private void button1_Click(object sender, EventArgs e)
                {
                int width = _rnd.Next(400, 800);
                int height = _rnd.Next(400, 800);

                UpdateWindowSize(width.ToString(), height.ToString());
                }

                private void UpdateWindowSize(string width, string height)
                {
                try
                {
                this.Size = new Size(int.Parse(width), int.Parse(height));
                }
                catch (Exception ex)
                {
                MessageBox.Show("Fehler\t" + ex.Message);
                }
                }
                }
                }
                [/highlight]

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  Ne Dispose() würde ich hier nicht einsetzen, du willst ja das Objekt nicht wegwerfen.
                  Wie groß ist das Fenster vor dem Update?
                  in welcher Klasse steckt UpdateWindowSize()?

                  Ich Tippe auch auf ein Nebeneffekt, aber mit dem kurzen Stückel Code kann man so natürlich nur raten. Wie und wo rufts du denn deine Form auf?
                  Just be DRY and KISS your customers.

                  Comment


                  • #10
                    Originally posted by gfoidl View Post
                    ...du musst irgendwelche Nebeneffekte haben die uns bisher verheimlicht hast (oder selbst nicht weißt)....
                    Originally posted by Frischmilch View Post
                    Ne Dispose() würde ich hier nicht einsetzen, du willst ja das Objekt nicht wegwerfen.
                    Wie groß ist das Fenster vor dem Update?
                    in welcher Klasse steckt UpdateWindowSize()?

                    Ich Tippe auch auf ein Nebeneffekt, aber mit dem kurzen Stückel Code kann man so natürlich nur raten. Wie und wo rufts du denn deine Form auf?

                    Hallo nochmals Ihr beiden, daran

                    Originally posted by Frischmilch View Post
                    ...aber mit dem kurzen Stückel Code kann man so natürlich nur raten....
                    solls nicht scheitern... im Anhang einmal die komplette Klasse...

                    Ich entdecke den Nebeneffekt leider nicht....

                    das Form ist vorher
                    [highlight=c#]
                    this.ClientSize = new System.Drawing.Size(882, 584);
                    [/highlight]

                    882 x 584 Pixel groß...

                    Danke nochmals und Grüße...
                    ...Stephan
                    Attached Files

                    "A fool with a tool is still a fool."

                    Comment


                    • #11
                      Vermutlich enthält die Designer.cs Datei zu deiner Form die interessanteren Teile.
                      Poste die doch bitte auch.

                      Comment


                      • #12
                        [highlight=c#]
                        private void SetControlPosition(UserControl control)
                        {
                        control.Parent = pnClientArea;
                        /*
                        control.Width = this.ClientRectangle.Width;
                        control.Height = this.ClientRectangle.Height - statusBar.Height - 100;
                        control.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right | System.Windows.Forms.AnchorStyles.Bottom;
                        */
                        this.ClientSize = new Size(control.Width, control.Height);
                        control.Dock = DockStyle.Fill;
                        control.Visible = true;
                        }
                        [/highlight]
                        Ich glaub da ist das Problem.
                        Dem UserControl wird als Parent das Panel zugewiesen. Dann wird dem Formular die Größe des UserControl zugewiesen und anschließend wird das UserControl mit Dock auf die Größe des Formulars angepasst und sichtbar geschalten.

                        Siehst du das Problem?

                        mfG Gü
                        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                        Comment


                        • #13
                          Also wo ich anfangen würde:
                          Das Panel soll offensichtlich so groß sein wie die Form?! Dann benutz doch die Dock-Eigenschaft, damit das pnClientPanel-Panel so groß ist, wie es maximal im Parent werden kann. Du musst dich also um dessen Größe dann nicht mehr kümmern. Prinzipiell würde ich darauf achten, Child Controls eine Abhängigkeit mitzugeben, welche die Größe/Position ausgehend vom Parent bestimmen kann (Dock und Anchor Eigenschaften, evtl. in einem Layoutmanager). Damit ändert sich dann nämlich alles innerhalb der Form automatisch, wenn sich die Größe der Form ändert und man muss sich nich um alles "manuell" kümmern.

                          deine SetControlPosition(..) sieht zwar etwas seltsam aus, dürfte aber keinen Fehler produzieren, da die Height und Width Properties echt kopiert werden (sollte zumindest so sein).

                          Du rufst nach SetControlPosition immer noch eine Initialize() Methode auf. Diese kommt vermutlich von dir? Kann es sein, dass du dort Eigenschaften der Componente wieder zurück setzt, welche du davor gesetzt hast? Ich würde Initialize() vor SetControlPosition() aufrufen.
                          Just be DRY and KISS your customers.

                          Comment

                          Working...
                          X