Avatar billede ahara Nybegynder
19. januar 2008 - 22:38 Der er 9 kommentarer

Opdatering af paneler

Jeg har to paneler, hvor det ene ligger i bunden af min form (panel2) og det andet i siden af min form (panel1) og ønsker at gøre panel1 visible (true/false) afhængigt af hvor stor min form er. Det er gjort på nedenstående måde:

***** Kode

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
               
        private void test()
        {
            if(this.panel2.Width > 450)
                this.panel1.Visible = false;
            else
                this.panel1.Visible = true;
        }

        protected override void OnLayout(LayoutEventArgs e)
        {
            base.OnLayout(e);
            listBox1.Items.Add("Horizontal" + panel2.Width);
            listBox1.Items.Add("Vertical" + panel1.Height);

            test();
        }
    }

***** End Kode

Det virker også ved resize, men ved klik på minimize/maximize eller dobbeltklik på øverste bjælke i min form så fjernes panel1, men bliver altid visible igen før jeg laver en resize.

Hvorledes kan jeg løse dette?
Avatar billede skov_p Praktikant
19. januar 2008 - 23:46 #1
Layout måske kaldes inden der er tegnet på skærmen, så der er størrelserne i test evt. = 0.

Skriv evt width ud i en Console, så du kan se dens værdi. Måske indeholder Size noget du kan bruge

Brug evt. OnPaint, der er muligvis kommet nogen størrelser i Width på panelerne
Avatar billede ahara Nybegynder
20. januar 2008 - 10:18 #2
Hmm, jeg har forsøgt at skrive både Height og Width ud på mit panel1 og kan se det ikke opdateres ved minimize/maximize.

Andre ideer?
Avatar billede skov_p Praktikant
20. januar 2008 - 22:02 #3
Din løsning virker som du ønker hvis jeg laver det.

Prøv at tilføje Invalidate(); nederst i din test() metode
Avatar billede ahara Nybegynder
20. januar 2008 - 22:27 #4
Det virker stadig ikke hos mig. Har du mulighed for at vise hvordan?

Tak
Avatar billede skov_p Praktikant
21. januar 2008 - 08:40 #5
Jeg lavede et nyt projekt og tilføjede 2 paneler og din kode.
Dog fjernede jeg

listBox1.Items.Add("Horizontal" + panel2.Width);
listBox1.Items.Add("Vertical" + panel1.Height);

Da jeg ikke mente at det havde relevans for problemet.

Men det virker som du har beskrevet det skulle.

Med Invalidate(); tvinger du applikationen til at tegne formen og så bør dine paneler vises i henhold til betingelserne.

private void test()
{
  if(this.panel2.Width > 450)
    this.panel1.Visible = false;
  else
    this.panel1.Visible = true;
  Invalidate();
}
Avatar billede ahara Nybegynder
21. januar 2008 - 08:54 #6
Kan du ikke sende koden for din designer?
Avatar billede skov_p Praktikant
21. januar 2008 - 09:36 #7
Kode til formen

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace LayoutTest {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void test() {
            if( this.panel2.Width > 450 )
                this.panel1.Visible = false;
            else
                this.panel1.Visible = true;
        }

        protected override void OnLayout(LayoutEventArgs e) {
            base.OnLayout( e );
           
            test();
        }

    }
}

****************************************
Kode til designeren

namespace LayoutTest {
    partial class Form1 {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing) {
            if( disposing && (components != null) ) {
                components.Dispose();
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent() {
            this.panel1 = new System.Windows.Forms.Panel();
            this.panel2 = new System.Windows.Forms.Panel();
            this.SuspendLayout();
            //
            // panel1
            //
            this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                                    | System.Windows.Forms.AnchorStyles.Right)));
            this.panel1.BackColor = System.Drawing.SystemColors.ControlDarkDark;
            this.panel1.Location = new System.Drawing.Point( 13, 20 );
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size( 266, 117 );
            this.panel1.TabIndex = 0;
            //
            // panel2
            //
            this.panel2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
                                    | System.Windows.Forms.AnchorStyles.Right)));
            this.panel2.BackColor = System.Drawing.SystemColors.ControlDark;
            this.panel2.Location = new System.Drawing.Point( 15, 151 );
            this.panel2.Name = "panel2";
            this.panel2.Size = new System.Drawing.Size( 263, 105 );
            this.panel2.TabIndex = 1;
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 13F );
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size( 292, 266 );
            this.Controls.Add( this.panel2 );
            this.Controls.Add( this.panel1 );
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout( false );

        }

        #endregion

        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.Panel panel2;
    }
}
Avatar billede ahara Nybegynder
21. januar 2008 - 18:33 #8
Det ser jo fint ud. Men jeg har docket mit ene panel til Bottom og det andet til Right. Her virker det ikke. Jeg har ikke mulighed for at tilføje og fjerne mit panel der er docket til Right.

Kan du også klare den?
Avatar billede ahara Nybegynder
21. januar 2008 - 18:39 #9
Det virker faktisk ved at docke det ene panel til Bottom og det andet til Top. Men ikke det ene panel til Bottom og det andet til Right.

Any idea?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester