2009-08-11 6 views
5

używam panelu w C# WinForm i wypełnić panel z żadnego z pole obrazu za pomocą pętliJak uzyskać dostęp do kontroli, które znajduje się w panelu w C#

Na przykład nazwa panel jest panal

foreach (string s in fileNames) 
{    
    PictureBox pbox = new new PictureBox(); 
    pBox.Image = Image.FromFile(s); 
    pbox.Location = new point(10,15); 
    . 
    . 
    . 
    . 
    this.panal.Controls.Add(pBox); 
} 

Teraz chcę zmienić lokalizację picturebox w innej metodzie. Problem polega na tym, że teraz mogę uzyskać dostęp do skrzynek graficznych, aby zmienić ich położenie. Próbuję użyć poniższych, ale to nie jest sukces.

foreach (Control p in panal.Controls) 
       if (p.GetType == PictureBox) 
        p.Location.X = 50; 

Ale jest błąd. Błąd jest:

System.Windows.Forms.PictureBox' is a 'type' but is used like a 'variable' 
+0

Jaki jest błąd? Czy jest to również WPF lub WinForm? Im więcej szczegółów podasz tym bardziej prawdopodobne, że uzyskasz odpowiedź, której szukasz. –

+0

Używam WinForm i błąd jest System.Windows.Forms.PictureBox "jest" typem ", ale jest używany jako" zmienna " – qulzam

+0

@ qulzam: Kod C. Ross rozwiąże twój problem –

Odpowiedz

18

ppear to niektóre literówki w tej sekcji (i prawdopodobnie prawdziwy błąd).

foreach (Control p in panal.Controls) 
       if (p.GetType == PictureBox.) 
        p.Location.X = 50; 

literówki są

  1. PictureBox następuje kropka (.)
  2. GetType brakuje parens (tak, to nie nazywa).

Błąd jest:

  • Nie można porównywać typ p do PictureBox, trzeba porównać go do typu PictureBox.

Powinno być:

foreach (Control p in panal.Controls) 
    if (p.GetType() == typeof(PictureBox)) 
     p.Location = new Point(50, p.Location.Y); 

lub po prostu:

foreach (Control p in panal.Controls) 
    if (p is PictureBox) 
     p.Location = new Point(50, p.Location.Y); 
+0

+1. Aby udzielić odpowiedzi, myślę, że dobrym pomysłem byłoby wskazanie literówek i błędów w oryginalnym fragmencie kodu. –

+0

Można również użyć polecenia Controls.OfType (), ale nie spowoduje to skrócenia kodu. – Benjol

+0

w wierszu (p.Lokacja.X = 50;) to błąd, np. Nie można zmodyfikować wartości zwracanej "System.Windows.Forms.Control.Location", ponieważ nie jest zmienną – qulzam

0

Nie chcesz

panel.Controls 
//^ this is an 'e' 

zamiast

panal.Controls? 
//^ this is an 'a' 
+0

Będą .. ale to nie powoduje błędu, to jest po prostu nazwa kontroli i jest pisownia agnostyczna. – Fooberichu

+0

Cóż, nie mogę wiedzieć, że jeśli nie powie, jaki błąd dostanie –

+0

Fooberichu, u r prawo – qulzam

0

W swoim drugim bloku okres po p.GetType == PictureBox jest źle (nie okres wymagane tutaj) ... w tym przypadku GetType to metoda/funkcja, a nie właściwość, więc musi to być p.GetType()

0

Następny że może być kilka błędów w swoim pętli for.

foreach (Control p in panel.Controls) 
{ 
    if (p is PictureBox) // Use the keyword is to see if P is type of Picturebox 
    { 
    p.Location.X = 50; 
    } 
} 
+0

otrzymałem następujący błąd w linii p.Lokacja.x = 50; Błąd Nie można zmodyfikować wartości zwracanej przez "System.Windows.Forms.Control.Location", ponieważ nie jest zmienną. – qulzam

+0

Rzucił znaną kontrolkę jako PictureBox: 'If (p to PictureBox) {PictureBox pb = (PictureBox) p.} ' – Zeeshanef

0

Użytkownik będzie lepiej dokonywania PictureBox prywatna zmienna samej formie, tak, że można robić rzeczy z niego bez konieczności krok choć na panelu sterowania za każdym razem.

4

Spróbuj tego:

foreach (Control p in panal.Controls) 
{ 
    if (p is PictureBox) 
    { 
     p.Left = 50; 
    } 
} 
+0

Dziękuję MusiGenesis. rozwiązuję to. Nadal mam confision, dlaczego (p.x = 50;) jest źle i podać błąd. jeśli użyjemy (p.Location = new point (50,10);) to się zgadza. Myślę, że nowy punkt jest równy wartościom x i y. czy ktoś może to wyjaśnić? – qulzam

+0

Nie mogę tego wyjaśnić, ale byłoby to dobre pytanie StackOverflow. – MusiGenesis

+0

Uważam, że PictureBox.Location.x jest właściwością tylko do odczytu. więc nie możemy tego zmienić ani napisać. – qulzam

0

myślę

foreach (PictureBox p in panel.Controls.OfType<PictureBox>()) 
     { 
      p.Location = new Point(50, p.Location.Y); 
     } 

może być rozwiązanie zbyt.