Pytania dot. kontrolki TableLayoutPanel

0

Stworzyłem tabelkę o 1 wierszu, w celu dodawania do niej picturebox'ów (programowo). Moja kontrolka ma 500 px szerokości więc chciałbym aby przy dodaniu piątego i kolejnych picturebox'ów był aktywny poziomy scroll. Niestety przy użyciu tabelka.AutoScroll = true; pojawia się poziomy i pionowy scroll. Myślałem, że pionowy pojawia się, bo brakuje w kontrolce miejsca na scroll'a na dole i zwiększam wysokość kontrolki, ale to i tak nie zapobiega zniknięciu scroll'a; pionowy pokazuje się i można nim przesuwać, mimo że pozwala to tylko na oglądanie pustego miejsca...
(wygląda na to, że pionowy scroll pokazuje się, bo poziomy jest wewnątrz kontrolki)
Próbowałem też z

tabelka.AutoScroll = false;
tabelka.HorizontalScroll.Enabled = true;
tabelka.HorizontalScroll.Visible = true;

ale wtedy poziomy scroll nie działa, mimo, że jest widoczny.

Pierwsze pytanie: Jak włączyć tylko poziomy scroll?

Drugie pytanie: Czy można zmienić kolor tła danej komórki w tej kontrolce? Chciałbym żeby po najechaniu na picturebox'a zmieniał się kolor tła komórki.

Picturebox'y dodaje w ten sposób:
tabelka.Controls.Add(picturebox);

Parametry tabelki jakie mam ustawione w edytorze wizualnym:

AutoScroll -> true
AutoSize -> true
CellBorderStyle -> Single
ColumnCount -> 1
GrowStyle -> AddColumns
RowCount -> 1
Visible -> false (staje się widoczna po dodaniu pierwszego picturebox'a)

i pytanie nie dotyczące tabelki:
Jak (programowo) usunąć wszystkie eventy z kontrolki?

0

Podbijam.

0

Sprawdziłem i faktycznie TableLayoutPanel zachowuje się dziwnie przy przepełnieniu.

Nie wiem dokładnie jaki efekt chcesz osiągnąć, ale może zadowoli Cię FloatLayoutPanel, który zachowuje się grzecznie z AutoScroll. Wiem, że to nie jest odpowiedź na zadane pytanie, jeśli z jakiegoś powodu musisz trzymać się tabeli, to poszukam dokładniej.

Co do drugiego pytanie, można rozwiązać to tak (zarówno dla TableLayoutPanel jak i FlowLayoutPanel):

  • zamiast dodawać bezpośrednio PictureBox, dodajesz Panel, na którym ustawiasz PictureBox (z pewnym marginesem)
  • pod zdarzenia myszy na PictureBox (i Panel jeśli tak uznasz za stosowne) podpinasz kod malujący tło Panela

Na przykład tak:

private void AddImage()
        {
            int margin = 20;
            PictureBox pb = new PictureBox();
            //pb.Image = ...;
            pb.SizeMode = PictureBoxSizeMode.Zoom;

            Panel p = new Panel();
            p.Size = new Size(pb.Width + margin*2, pb.Height + margin*2);            
            p.Controls.Add(pb);
            pb.Location = new Point(margin,margin);
            
            p.MouseEnter += new EventHandler(p_MouseEnter);
            p.MouseLeave += new EventHandler(p_MouseLeave);
            pb.MouseEnter += new EventHandler(pb_MouseEnter);
            pb.MouseLeave += new EventHandler(pb_MouseLeave);            

            flowLayoutPanel1.Controls.Add(p); // można to zrobić też dla TableLayoutPanel
        }

        private Color _HighlightedColor = Color.LightBlue;
        private Color _DefaultColor = Color.Transparent;

        void p_MouseLeave(object sender, EventArgs e)
        {
            ((Panel)sender).BackColor = _DefaultColor;
        }

        void p_MouseEnter(object sender, EventArgs e)
        {
            ((Panel)sender).BackColor = _HighlightedColor;
        }

        void pb_MouseLeave(object sender, EventArgs e)
        {
            ((Panel)((Control)sender).Parent).BackColor = _DefaultColor;
        }

        void pb_MouseEnter(object sender, EventArgs e)
        {
            ((Panel)((Control)sender).Parent).BackColor = _HighlightedColor;
        }

0

No i pięknie :)
FloatLayoutPanel bardzo dobrze się sprawdza.
A co do podświetlenia to też dobry pomysł, dużo kontrolek ale ważne, że działa.

Bardzo dziękuję za pomoc. Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1