Zmiana stanu wyświetlenia picturebox'a

0

Mam picture box'a, który zmienia obrazek gdy zmienia się stan w bazie. Ale widzę to dopiero gdy w niego kliknę.
Jak zrobić aby zaraz po uruchomieniu było to widoczne ?

pozdrawiam

0

Gdy dodałem Timer i w nim wpisałem kod pobierający info z bazy i wyświetlający obraz to wszystko działa ładnie zaraz po uruchomieniu programu. No ale na dłuższą metę nie można tak robić bo przecież nie będę tworzył Timera do każdego picturebox'a. Chciałem wiec zapytać jak dodać sam Timer do picterbox'a lub czy da się odświeżyć całego Groupbox'a bo w nim są poukładane picturebox'y.

0

Możesz przecież podpiąć jedno zdarzenie pod wiele kontrolek to raz. Dwa to możesz pobrać wszystkie 'childy' kontrolki, czyli np. group box mógłby pobierać informacje dla wszystkich pictureboxów, które zawiera.

0
Sarrus napisał(a):

Możesz przecież podpiąć jedno zdarzenie pod wiele kontrolek to raz.

hmmm a mógłbyś mi podpowiedzieć jak to zrobić bo nie bardzo wiem jak ....

0
adam_c napisał(a):
Sarrus napisał(a):

Możesz przecież podpiąć jedno zdarzenie pod wiele kontrolek to raz.

hmmm a mógłbyś mi podpowiedzieć jak to zrobić bo nie bardzo wiem jak ....

A jak podpinasz zdarzenie pod kontrolkę?

0

no właśnie nie wiem jak podpiąć picturebox'a pod Timer...

private void timer1_Tick(object sender, EventArgs e)
        {
         
            if (pictureBox6.Visible)
            {
                timer1.Enabled = true;
            }

 

?

0

W zdarzeniu które pokazałeś sprawdzasz czy się zmienił stan w bazie i podmieniasz obrazki tak? Po tej operacji wystarczy jak wywołasz Refresh() na tych pictureboxach, albo na panelu, na którym się znajdują. Może to być też GroubBox i każdy element dziedziczący po Control.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.refresh.aspx napisał(a)

Forces the control to invalidate its client area and immediately redraw itself and any child controls.

0
Sarrus napisał(a):

W zdarzeniu które pokazałeś sprawdzasz czy się zmienił stan w bazie i podmieniasz obrazki tak?
</quote>

Dokładnie tak... Picturebox'y osadzone są na GroupBox'ie . Gdy daję refresh() to nic to nie skutkuje.
Próbowałem tak :


private void groupBox1_VisibleChanged(object sender, EventArgs e)
        {
            if (groupBox1.Visible)
            {
                timer1.Enabled = true;
            }
            
 

Lecz też to nie skutkuje. Picturebox'y działają pobierają dane ale wyświetlają się tylko wtedy gdy w nie kliknę...

0

Tak to powinno mniej więcej działać:

private void timer1_Tick(object sender, EventArgs e)
{
    bool stanWBazieSieZmienil = SprawdzStanWBazie();
    if (stanWBazieSieZmienil)
    {
        groupBox1.Refresh();
    }
}

private void groupBox1_VisibleChanged(object sender, EventArgs e)
{
   timer1.Enabled = groupBox1.Visible;
}

Upewnij się, że zdarzenie Ci się wywołuje.

0
 
private void timer1_Tick(object sender, EventArgs e)
        {
 try
            {
                myConnection.Open();
                SqlCommand myCommand = new SqlCommand("Command String", myConnection);
                myCommand.CommandText = "SELECT state FROM stan WHERE state = @stany";


                SqlParameter parameter = new SqlParameter();
                parameter.ParameterName = "@stany;
                parameter.SqlDbType = SqlDbType.Int;
                parameter.Direction = ParameterDirection.Input;
                myCommand.Parameters.Add(parameter);
                object val = myCommand.ExecuteScalar();

                int state = System.Convert.ToInt32(val);

Pobieram stany z bazy dla wszystkich urządzeń , jak mam w pętli odświeżyć wszystkie picturebox'y ?

0
adam_c napisał(a):

Pobieram stany z bazy dla wszystkich urządzeń , jak mam w pętli odświeżyć wszystkie picturebox'y ?

W pętli możesz przeiterować się po wszystkich kontrolkach. Na przykład załóżmy, że wszystkie są w groupBox1:

foreach (Control c in groupBox1.Controls)
{
   if (c is PictureBox)
  {
      (c as PictureBox).Image = ....; //przykładowo
  }
}

Można to jeszcze lepiej zrobić za pomocą linq, ale to temat na następną lekcję ;]

0

hehe powiem szczerze, że już nic z tego nie kumam ...

0

Przede wszystkim tak się nie pisze:

foreach (Control c in groupBox1.Controls)
{
   if (c is PictureBox)
  {
      (c as PictureBox).Image = ....; //przykładowo
  }
}

Albo tak:

foreach (Control c in groupBox1.Controls)
{
   if (c is PictureBox)
  {
      (PictureBox)c).Image = ....; //bo tutaj już jesteśmy pewni, że c jest PictureBoxem
  }
}

Albo (moim zdaniem ładniej) tak:

foreach (Control c in groupBox1.Controls)
{
   PictureBox pb = c as PictureBox; // jeśli c nie jest PictureBox, to pb będzie null
   if (pb != null)
  {
      pb.Image = ....;
  }
}

Robienie najpierw is, a potem as jest bez sensu.

0

Przepraszam za to pytanie ale moja wiedza a temat pętli foreach jest bardzo mała i mam teraz problem... Zasadę działania mniej więcej rozumiem ale co mam wstawić za
(PictureBox)c).Image = ??? bo nie bardzo wiem co, aby odświeżyć picturegox'y. Z góry dziękuję za odpowiedź.

0
adam_c napisał(a):

Przepraszam za to pytanie ale moja wiedza a temat pętli foreach jest bardzo mała i mam teraz problem... Zasadę działania mniej więcej rozumiem ale co mam wstawić za
(PictureBox)c).Image = ??? bo nie bardzo wiem co, aby odświeżyć picturegox'y. Z góry dziękuję za odpowiedź.

To był tylko przykład jak rzutować, żeby podmienić obrazek czy cokolwiek innego. Nie traktuj każdego kawałka kodu jak gotowiec.
Jeżeli masz na przykład bitmapy:

foreach (Control c in groupBox1.Controls)
{
   PictureBox pb = c as PictureBox;
   if (pb != null)
  {
      pb.Image = new Bitmap("mybitmap.bmp");
      pb.Refresh();
  }
}

http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx

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