Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C#] Nieprawidlowe rysowanie tabeli w zakladkach

Ostatnio zmodyfikowano 2015-05-22 08:11
Autor Wiadomość
Vanilka
Temat założony przez niniejszego użytkownika
[C#] Nieprawidlowe rysowanie tabeli w zakladkach
» 2015-05-20 11:28:37
Mam problem, zwiazane z wyswietlaniem dabeli podczas klikania w inna zakladke.
Moj program posiada dynamiczne tworzenie zakladek. W chwili klikniecia w nowa zakladke utworzony zostaje obiekt, i na zakladke rysowana jest tabelka zgodnie z danymi z obiektu.

I teraz tak. samo tworzenie przebiega bezproblemowo.  Natomiast gdy przelaczam sie miedzy zakladkami, to rysowany jest obiekt z zakladki na ktora kliknelam uprzednio.

Stworzylam dodatkowe etykiety aby sprawdzic czy to nie jest problem z blednym pobraniem danych o obiekcie, ale nie, te dane wyswietlane sa prawidlowo.

Pomozcie prosze.


 private void NvelleTab()
                {
                string title = "TabPage " + (id_tab+1).ToString();
                id_tab++;
                TabPage myTabPage = new TabPage(title);               
                this.tabControl1.TabPages.Add(myTabPage);
                this.tabControl1.SelectedTab = myTabPage;
                this.tabControl1.SelectedTab.Name = id_tab.ToString();
                this.tabControl1.SelectedTab.Paint += new System.Windows.Forms.PaintEventHandler(this.tabPage1_Paint);
 
        }
        private void nowyToolStripMenuItem_Click(object sender, EventArgs e)
        {
 
            // wyswietlenie Form2
            NvlleChoix = new DateChoix(this);
 
            if (NvlleChoix.ShowDialog() == DialogResult.OK)
             {                
                this.Legende.Visible = true;
                NvelleTab ();
                id_stab = int.Parse(this.tabControl1.SelectedTab.Name);
 
                Callandier call = new Callandier(Callandier.pub_mois, Callandier.pub_an, id_tab);
 
                this.obj_list.Add(call);
 
                label2.Text = id_tab.ToString();
                label3.Text = "Name" +this.tabControl1.SelectedTab.Name;
                label4.Text = obj_list[id_tab-1].af_an().ToString();
                label5.Text = obj_list[id_tab-1].combien_jour().ToString();
 
            };
        }
 
 
 
        private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
 
        }
 
 
        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
 
        }
 
        // Usuwanie zakładek
        private void EffacerTab()
        {
            TabPage choix_page = tabControl1.SelectedTab;
            this.tabControl1.TabPages.Remove(choix_page);
 
        }
        //Usuwanie zakladek
        private void zamknijZakladkeToolStripMenuItem_Click(object sender, EventArgs e)
        {
 
            this.EffacerTab();
            //wyswietlenie danych zakladki wybranej
            id_stab = int.Parse(this.tabControl1.SelectedTab.Name);
            label4.Text = obj_list[id_stab - 1].af_an().ToString();
        }
 
 
 
        private void tabControl1_Click(object sender, EventArgs e)
        {
            id_stab = int.Parse(this.tabControl1.SelectedTab.Name);
            this.tabControl1.SelectedTab.Paint += new System.Windows.Forms.PaintEventHandler(this.tabPage1_Paint);
            label3.Text = "Name" + this.tabControl1.SelectedTab.Name;
            label4.Text = obj_list[id_stab-1].af_an().ToString();
            label5.Text = obj_list[id_stab-1].combien_jour().ToString();
 
        }
      private void tabPage1_Paint(object sender, PaintEventArgs e)
        {
 
           graph = tabControl1.SelectedTab.CreateGraphics();
 
           this.obj_list[id_stab-1].rysuj(graph);
 
        }  


  public void rysuj (Graphics g)
            {
                int x1 = 0;
                int y1 = 40;
                int szer = 10;
                int wys = 20;
 
                Pen p = new Pen(Color.Black, 1);
 
                for (int j = 1; j <= 5; j++ )
                {
                    x1 = 0;
                    for (int i = 0; i <= this.combien_jour(); i++)
                    {
                        g.DrawRectangle(p, x1, y1, szer, wys);
                        x1 += szer;
                    }
                    y1 += wys;
 
                 }  
            }
 
P-132536
darko202
» 2015-05-20 12:56:50
1.
trudno zrozumieć ten problem, ale wydaje mi się ze gdyby zmienić
id_stab-1  na id_stab
np. w
this.obj_list[id_stab-1].rysuj(graph);
// miejsca nie jestem pewny - musi to być procedura która rysuje tą tabelkę w nowej zakładce - tu użyj trybu debag do analizy,

to rysowała by się właściwa zakładka

2.
pewnie wiesz, ale pamiętam, ze w C# zdarzenia dla danego elementu wykonują się w określonej kolejności, kiedyś widziałem taki opis lista opisująca tą kolejność wykonania(może - Język C# 2008 i platforma NET 3.5 lub jakiś kurs C# )
i ważne jest wykonywanie odpowiednich kroków w odpowiednich event'ach
uwzględniając tą kolejność

3.
może wystarczy przeanalizować
https://msdn.microsoft.com​/pl-pl/library​/system.windows.forms.control_events(v=vs.110).aspx
https://msdn.microsoft.com​/en-us/library​/86faxx0d(v=vs.110).aspx
jak nie mamy to badamy w trybie debug i jakoś tą kolejność ustalamy.


 


P-132539
Vanilka
Temat założony przez niniejszego użytkownika
» 2015-05-20 14:29:09
hej :) dzieki za odpowiedz. Jezeli chodzi o id_stab to to dziala prawidlowo, gdyby zmienic to na taka wersje jak proponujesz, to program bedzie sie wysypywal, o przy kliknieciu na nowa zakladke, dojdzie do przekroczenia tablicy.
Polowicznie udalo mi sie rozwiazac problem poprzez, dodanie do funkcji click   tabcontrol.selectedtab.refrech().

ale mimo to wolalabym iwedziec jak to napisac inaczej
P-132540
darko202
» 2015-05-21 09:21:01
hej :)
1.
nie rozumiem tego
"Polowicznie udalo mi sie rozwiazac problem poprzez, dodanie do funkcji click   tabcontrol.selectedtab.refrech()."

bo wydawało mi się, ze na tym to polega (także)
dodajemy obsługę brakujących "event"
o tym myślałem myśli pisząc o ustaleniu kolejności wykonania event.
- dodałaś ten brakujący event i zaczęło działać

miałem kiedyś problem (C++Builider), gdy klient chciał, aby przed wejściem do pola typu TEdit pole miało białe tło po wejściu żółte, a po wyjściu z niego niebieskie

dodam, że zaczynałem z C++Builder i wydawało mi się to trudne :)
a było to chyba dodanie kodu w 3-4 event tego TEdit

2.
>>Jezeli chodzi o id_stab to to dziala prawidlowo,
to dobrze, bo inaczej to zrozumiałem

>>gdyby zmienic to na taka wersje jak proponujesz, to program bedzie sie wysypywal, o przy kliknieciu na nowa zakladke, dojdzie do przekroczenia tablicy.

niezależnie od tego jak wydaje się to głupie to
dodając nową zakładkę - musimy dodać tą zakładkę i nie powinno dojść do przekroczenia indeksu w tablicy zakładek.
ale oczywiście trzeba to wcześniej zrobić (odpowiedni event - realizowany przed tym obsługującym przejście na kolejna zakładkę)
inaczej rzeczywiście dojdzie do przekroczenia 


 
 

P-132559
Vanilka
Temat założony przez niniejszego użytkownika
» 2015-05-21 09:52:16
mowiac ze dziala polowicznie, chodzilo mi o to, że teraz jak klikam w te sama zakladke na ktorej jestem, to on odswieza ekran. I jest to widoczne.


        private void tabControl1_Click(object sender, EventArgs e)
        {
      
            id_stab = int.Parse(this.tabControl1.SelectedTab.Name);          
            label3.Text = "Name" + this.tabControl1.SelectedTab.Name;
            label4.Text = obj_list[id_stab-1].af_an().ToString();
            label5.Text = obj_list[id_stab-1].combien_jour().ToString();
           
            this.tabControl1.SelectedTab.Refresh();
           
           
        }

jakby co to te label'y to sa tylko do pomocy, abym widziala ze wszystkie zmiany sa prawidlowo wykonywane..
P-132561
darko202
» 2015-05-21 11:23:07
wydaje się że rozwiązanie jest proste sprawdzaj która zakładka jest otwarta
na
https://www.google.pl/​?gws_rd=ssl#q=od%C5%9Bwie%C5%BCanie+zak%C5%82adek+tabcontrol
znalazłem
http://forum.4programmers.net​/C_i_.NET​/200414-jak_okreslic_ktora_zakladka_w_tabcontrol_jest_otwarta
a tam "..zdarzenia wywoływanego przy zmianie zakładki.." np.
http://msdn.microsoft.com​/en-u[...]s.control.tabindexchanged.aspx


na
https://msdn.microsoft.com​/pl-pl/library​/system.windows.forms.tabcontrol(v=vs.110).aspx
jest kilka ciekawych event związanych z odświeżaniem
np.
ResetBindings


-----------
albo zwykły if bo 
id_stab = int.Parse(this.tabControl1.SelectedTab.Name);
po zmianie zakładki chyba powinien się zmienić

nie zmienił się nie odświeżasz

P-132564
Vanilka
Temat założony przez niniejszego użytkownika
» 2015-05-21 13:06:58
SelectedIndexChanged nie podzialalo. 

Zadzialalo natomiast w ten sposob :

private void tabControl1_Click(object sender, EventArgs e)
        {
            int id_tabt = id_stab;
           
            id_stab = int.Parse(this.tabControl1.SelectedTab.Name);          
            label3.Text = "Name" + this.tabControl1.SelectedTab.Name;
            label4.Text = obj_list[id_stab-1].af_an().ToString();
            label5.Text = obj_list[id_stab-1].combien_jour().ToString();
           
           if (id_tabt != id_stab)
           {
                this.tabControl1.SelectedTab.Refresh();
           }
           

Jendakze nie jest to roziwazanie zbyt optymalne, poniewaz widze, że za kazdym razem jak zmieniam zakladke, najpierw jest wyswietlana "stara" tabelka a potem nowa tabelka... niby efekt jest ten sam, ale jednak :D
P-132566
darko202
» 2015-05-22 08:11:10
umieść MessageBox na początku i końcu kodu każdego event odświeżającego ekran 

DialogResult result; // Displays the MessageBox.
result = MessageBox.Show("event o nazwie ...", "test", MessageBoxButtons.YesNo);
https://msdn.microsoft.com​/pl-pl/library​/system.windows.forms.messagebo​x(v=vs.110).aspx​?cs-save-lang=1​&cs-lang=csharp#code-snippet-2

to pozwoli Ci ustalić w który event odpowiada za kolejne odświeżenia ekranu
P-132592
« 1 »
  Strona 1 z 1