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; } }
|
|
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).aspxhttps://msdn.microsoft.com/en-us/library/86faxx0d(v=vs.110).aspxjak nie mamy to badamy w trybie debug i jakoś tą kolejność ustalamy. |
|
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 |
|
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
|
|
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.. |
|
darko202 |
» 2015-05-21 11:23:07 |
|
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 |
|
darko202 |
» 2015-05-22 08:11:10 |
|
« 1 » |