Avatar billede r.hegaard Nybegynder
19. januar 2007 - 22:28 Der er 11 kommentarer og
2 løsninger

Fejl i .Net? Problemer med TabControl's

Jeg har været ved at arbejde lidt med nogle TabControl's og det har givet mig en del problemer. Jeg er meget i tvivl om, om jeg gør noget forkert eller der er nogle fejl i .Net Frameworket.

Nedenfor er et eksempel, hvor jeg har en Form med 2 TabControl's (den ene inden i den anden). På begge TabControl's ønsker jeg at få tilføjet nogle TabPage'. Dette gør jeg ved at kalde "tabControl.TabPages.Insert( 1, tabPage );", da jeg gerne vil kontrollere, hvor min TabPage bliver placeret.
Det har dog givet mig nogle problemer. Når jeg gør, som i nedenstående eksempel, så ser jeg ikke mine tabs, når vinduet åbner.
Hvis jeg så klikker på "Reload"-knappen, så kommer de frem. Knappen kalder ellers samme metode som constructor'en, så jeg kan ikke lige se, hvad forskellen er. Har jeg gjort noget forkert?
Hvis jeg i stedet for "Insert" bruger "Add", så virker det hele fint. Hvad skyldes det?
Hvis jeg igen skifter tilbage til "Insert" og derefter fjerner stregerne foran "tabControl2.TabPages.Clear();", så ser det ud til, at det nu virker for tabControl2. Det samme sker, hvis man gør det med tabControl1. Men hvorfor er det nødvendigt, at TabPages er tom inden man bruger "Insert"??
Hvis man igen går tilbage til den oprindelige kode og så kalder "tabPage.Visible = true;", hver gang der bliver oprettet en TabPage, så kommer DataGridView'et op og stå i toppen, hvor overskiften ellers skulle have stået i TabPage'en. Hvordan kan det lade sig gøre bare fordi man kalder "Visible" på "TabPage"??
Af en eller anden grund, så har Microsoft valgt at skjule "Visible" på "TabPage" fra IntelliSense.



using System;
using System.Windows.Forms;

namespace TabControlTest
{
  public partial class TestView : Form
  {
      public TestView()
      {
        InitializeComponent();   
        button1_Click( null, null );
      }

      private void button1_Click( object sender, EventArgs e )
      {
        while( tabControl1.TabPages.Count > 1 )tabControl1.TabPages.RemoveAt( 1 );
        while( tabControl2.TabPages.Count > 1 )tabControl2.TabPages.RemoveAt( 1 );
//        tabControl1.TabPages.Clear();
//        tabControl2.TabPages.Clear();

        foreach (String tab in new String[] { "Tab1", "Tab2", "Tab3", "Tab4", "Tab5", "Tab6", "Tab7" }) SetUpTabAndGrid( tab, tabControl1, 1 );

        SetUpTabAndGrid( "SubTab1", tabControl2, 0 );
        SetUpTabAndGrid( "SubTab2", tabControl2, 0 );
        SetUpTabAndGrid( "SubTab3", tabControl2, 0 );
      }

      private void SetUpTabAndGrid( String name, TabControl tabControl, int pos )
      {
        TabPage tabPage = new TabPage( name );
        DataGridView grid = new DataGridView();
        tabControl.TabPages.Insert( 1, tabPage );
        tabPage.Controls.Add( grid );
        grid.Dock = DockStyle.Fill;
//        tabPage.Visible = true;
      }

      private void InitializeComponent()
      {
        this.tabControl1 = new System.Windows.Forms.TabControl();
        this.tabPageSubTab1 = new System.Windows.Forms.TabPage();
        this.tabControl2 = new System.Windows.Forms.TabControl();
        this.button1 = new System.Windows.Forms.Button();
        this.tabControl1.SuspendLayout();
        this.tabPageSubTab1.SuspendLayout();
        this.SuspendLayout();
        this.tabControl1.Controls.Add( this.tabPageSubTab1 );
        this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.tabPageSubTab1.Controls.Add( this.tabControl2 );
        this.tabPageSubTab1.Text = "Test";
        this.tabControl2.Dock = System.Windows.Forms.DockStyle.Fill;
        this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
        this.button1.Location = new System.Drawing.Point( 604, 0 );
        this.button1.Size = new System.Drawing.Size( 59, 22 );
        this.button1.Text = "Reload";
        this.button1.Click += new System.EventHandler( this.button1_Click );
        this.ClientSize = new System.Drawing.Size( 663, 563 );
        this.Controls.Add( this.button1 );
        this.Controls.Add( this.tabControl1 );
        this.Text = "Test";
        this.tabControl1.ResumeLayout( false );
        this.tabPageSubTab1.ResumeLayout( false );
        this.ResumeLayout( false );
      }

      private System.Windows.Forms.TabPage tabPageSubTab1;
      private System.Windows.Forms.TabControl tabControl2;
      private System.Windows.Forms.TabControl tabControl1;
      private System.Windows.Forms.Button button1;
  }
}
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 15:41 #1
Muligvis ligger tabpagen bag. prøv at kalde BringToFront() på controllen.
Avatar billede r.hegaard Nybegynder
20. januar 2007 - 17:41 #2
Det hjælper intet. Det forklarer vel heller ikke, at TabPage'en bliver placeret forkert??
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 17:43 #3
nej det er sandt.
tester lige lidt
Avatar billede r.hegaard Nybegynder
20. januar 2007 - 17:49 #4
Lige en lille rettelse: Det er DataGridView'et der bliver placeret forkert, når man kalder "tabPage.Visible = true;".
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 18:07 #5
Problemet er ikke en bug.
Problemet er at du begynder at tegner på windows formen før den er klar til det.
Avatar billede r.hegaard Nybegynder
20. januar 2007 - 18:11 #6
OK, hvordan skal jeg så gøre?
Hvordan kan det være, at der er forskel mellem "Insert" og "Add"?
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 18:11 #7
problemet løses ved at indsætte:
protected override void OnLoad(EventArgs e)
        {
            button1_Click(null, null);
            base.OnLoad(e);
        }
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 18:12 #8
jeg lagde mærke til at når jeg brugte insert, så blev tabpagecollection aldrig talt op.
ved første run.
Avatar billede dr_chaos Nybegynder
20. januar 2007 - 18:15 #9
ved add laver ikke en control. Der adder du et element som skal renderes når den er klar.
Ved insert tilføjer du en allerede renderet control.
Vil jeg mene.
Avatar billede r.hegaard Nybegynder
24. januar 2007 - 17:06 #10
dr_chaos> Tak for dine svar.
Jeg har været igang med at teste lidt på det og dine forslag løser det i nogle tilfælde, men ikke i alle. Jeg er også stødt ind i andre mærkelige ting med TabControl'en.
Jeg undrer mig lidt over, hvorfor denne control opfører sig meget anderledes end andre controls. Har du en idé om det? Er det bare fordi den er fyldt med fejl?
Kender du evt. nogle andre gode gratis TabControl's, som man kan downloade på nettet?
Avatar billede dr_chaos Nybegynder
24. januar 2007 - 17:15 #11
hvilke tilfælder løser det ikke problemet ?
Avatar billede r.hegaard Nybegynder
03. marts 2007 - 12:50 #12
dr_chaos> Jeg har desværre ikke kunnet genskabe problemet.
Jeg synes ikke, jeg har har fået så uddybende svar, men du skal selvfølgelig have nogle point alligevel. Lægger du et svar?
Avatar billede dr_chaos Nybegynder
03. marts 2007 - 17:02 #13
Fair nok.
Svar :)
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