Avatar billede MikkelNielsen Nybegynder
22. juni 2009 - 11:39 Der er 5 kommentarer og
1 løsning

Problemer med scrollbars

Hej,

Jeg har et problem med scrollbars. Løsningen er garanteret ultra simpel, men nu har det drillet mig længe nok, så here goes. :)

Jeg har en Windows form. På den form er der et panel med property AutoScroll = true. På panelet har jeg en TextBox, hvis bredde er større end panelets bredde. Når jeg kører programmet, får jeg en fin vandret scrollbar som forventet. Og nu kommer problemet:

Jeg klikker på scrollbaren og trækker den helt mod højre. Fint nok. Når jeg så alt-tabber, så et andet program får fokus, og dernæst alt-tabber tilbage igen, så hopper scrollbaren tilbage til startpositionen.

A) Hvorfor gør den det?
B) Hvordan får jeg den til at lade være med det?

På forhånd tak.
Avatar billede martinbk Nybegynder
22. juni 2009 - 12:34 #1
et gæt uden at have testet det, den hopper tilbage fordi markøren ikke er visible hvis den står helt til venstre
Avatar billede MikkelNielsen Nybegynder
22. juni 2009 - 12:45 #2
Hej,

Det er lige meget, hvor markøren står. Den hopper stadigvæk tilbage til startpositionen lige så snart den får fokus. Her er koden for en god ordens skyld:


namespace WindowsApplication1
{
    partial class Form1
    {
        private System.ComponentModel.IContainer components = null;
        protected override void Dispose( bool disposing )
        {
            if( disposing && ( components != null ) )
            {
                components.Dispose();
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.groupBox1 = new System.Windows.Forms.GroupBox();
            this.panel1.SuspendLayout();
            this.groupBox1.SuspendLayout();
            this.SuspendLayout();
            //
            // panel1
            //
            this.panel1.AutoScroll = true;
            this.panel1.Controls.Add( this.textBox1 );
            this.panel1.Location = new System.Drawing.Point( 6, 13 );
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size( 89, 100 );
            this.panel1.TabIndex = 0;
            //
            // textBox1
            //
            this.textBox1.Location = new System.Drawing.Point( 3, 28 );
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size( 320, 20 );
            this.textBox1.TabIndex = 0;
            this.textBox1.Text = "This is a very long line of text.";
            //
            // groupBox1
            //
            this.groupBox1.Controls.Add( this.panel1 );
            this.groupBox1.Location = new System.Drawing.Point( 12, 11 );
            this.groupBox1.Name = "groupBox1";
            this.groupBox1.Size = new System.Drawing.Size( 103, 122 );
            this.groupBox1.TabIndex = 1;
            this.groupBox1.TabStop = false;
            this.groupBox1.Text = "groupBox1";
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 13F );
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.AutoScroll = true;
            this.ClientSize = new System.Drawing.Size( 364, 257 );
            this.Controls.Add( this.groupBox1 );
            this.Name = "Form1";
            this.Text = "Form1";
            this.panel1.ResumeLayout( false );
            this.panel1.PerformLayout();
            this.groupBox1.ResumeLayout( false );
            this.ResumeLayout( false );

        }
        #endregion
        private System.Windows.Forms.Panel panel1;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.GroupBox groupBox1;
    }
}
Avatar billede tjacob Juniormester
22. juni 2009 - 12:55 #3
A) Når en control får fokus, så -hvis dens parent har scrollbars- kaldes parents (i dette tilfælde panelets) ScrollControlIntoView metode. Dette betyder at parenten vil forsøge at gøre childkontrollen synlig (i dette tilfælde textboxen). Åbenbart betyder "synlig" i denne sammenhæng, at textboxens (0,0) skal være synlig, altså helt tilbage.

B) Har jeg ikke rigtigt noget bud på, men kig på den nederste post her: http://www.daniweb.com/forums/thread6213.html#
Avatar billede MikkelNielsen Nybegynder
22. juni 2009 - 13:23 #4
Simpelthen genialt! Efter at have læst det indlæg, du linkede til, gjorde jeg følgende:

private void InitializeComponent()
        {
            this.panel1 = new MyPanel(); //System.Windows.Forms.Panel();
...
...

    public class MyPanel : Panel
    {
        protected override Point ScrollToControl( System.Windows.Forms.Control activeControl )
        {
            return this.AutoScrollPosition;
        }
    }

Og vupti! Ikke så meget p*s. Nu er det mig, der styrer autoscroll position. :D

Takker mange gange.
Avatar billede MikkelNielsen Nybegynder
22. juni 2009 - 13:31 #5
tjacob, jeg vil gerne give dig point, men du skal vistnok formulere dit indlæg som et svar i stedet for en kommentar, før jeg kan gøre det? Som det er lige nu og her har jeg ingen mulighed for at acceptere din løsning.
Avatar billede tjacob Juniormester
22. juni 2009 - 13:43 #6
Du har ret, -her er svaret
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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