2009-08-11 48 views
5

tôi sử dụng một bảng điều khiển trong C# winforms và điền panel với nội dung không có trong hộp hình ảnh sử dụng vòng lặpLàm thế nào để truy cập điều khiển mà là trong bảng điều khiển trong C#

Ví dụ, tên bảng là 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); 
} 

bây giờ tôi muốn thay đổi vị trí của picturebox theo một phương pháp khác. Vấn đề là làm thế nào bây giờ tôi có thể truy cập vào pictureboxes để tôi thay đổi vị trí của chúng. Tôi cố gắng sử dụng những điều sau đây nhưng nó không phải là thành công.

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

Nhưng có lỗi. Lỗi này là:

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

Lỗi là gì? Cũng là WPF hay Winforms này? Càng chi tiết bạn cung cấp cho nhiều khả năng bạn sẽ nhận được câu trả lời bạn đang tìm kiếm. –

+0

Tôi sử dụng winforms và lỗi là System.Windows.Forms.PictureBox 'là' loại 'nhưng được sử dụng như một' biến ' – qulzam

+0

@qulzam: Mã của C. Ross sẽ giải quyết vấn đề của bạn –

Trả lời

18

Có một ppear là một số lỗi chính tả trong phần này (và có thể là một lỗi thực).

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

Các lỗi chính tả là

  1. PictureBox được theo sau bởi một dấu chấm (.)
  2. GetType thiếu dấu ngoặc (vì vậy nó không được gọi).

Lỗi này là:

  • Bạn không thể so sánh các loại p để PictureBox, bạn cần phải so sánh nó với các loại PictureBox.

này nên là:

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

Hoặc đơn giản là:

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

+1. Để làm cho câu trả lời hoàn thành, tôi đoán có thể là một ý tưởng hay để chỉ ra lỗi chính tả và lỗi trong đoạn mã gốc. –

+0

Cũng có thể sử dụng Controls.OfType (), không phải là nó rút ngắn mã. – Benjol

+0

trong dòng (p.Location.X = 50;) là err, tức là Không thể sửa đổi giá trị trả về của 'System.Windows.Forms.Control.Location' vì nó không phải là biến – qulzam

0

Em không muốn

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

thay vì

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

Chúng sẽ .. Nhưng điều đó không gây ra lỗi, đó chỉ đơn giản là tên của điều khiển và chính tả bất khả tri. – Fooberichu

+0

Vâng, tôi không thể biết rằng nếu anh ta không nói lỗi nào anh ta nhận được –

+0

Fooberichu, u r right – qulzam

0

Trong khối thứ hai của bạn giai đoạn sau p.GetType == PictureBox là sai (không có thời gian cần thiết ở đây) ... cho rằng vấn đề, GetType là một phương pháp/chức năng không phải là một tài sản vì vậy nó cần phải được p.GetType()

0

Tiếp theo có thể có một số lỗi trong cho bạn vòng lặp.

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

i recevid sau đây err trong dòng p.Location.x = 50; Lỗi Không thể sửa đổi giá trị trả về của 'System.Windows.Forms.Control.Location' vì nó không phải là biến số – qulzam

+0

Truyền điều khiển đã biết là PictureBox: 'If (p là PictureBox) {PictureBox pb = (PictureBox) p} ' – Zeeshanef

0

Bạn nên tắt hình tượng một biến riêng tư của biểu mẫu, để bạn có thể thực hiện mọi việc với nó mà không cần phải điều khiển từng bảng điều khiển.

4

Hãy thử điều này:

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

Cảm ơn MusiGenesis. tôi giải quyết nó. Vẫn còn tôi có lý do tại sao (p.x = 50;) là sai và đưa ra lỗi. nếu chúng ta sử dụng (p.Location = new point (50,10);) nó là đúng. tôi nghĩ rằng điểm mới cũng bằng với giá trị x và y. bất kỳ ai có thể giải thích điều này? – qulzam

+0

Tôi không thể giải thích nó, nhưng nó sẽ là một câu hỏi StackOverflow tốt. – MusiGenesis

+0

tôi nghĩ rằng PictureBox.Location.x chỉ đọc thuộc tính. vì vậy chúng tôi không thể thay đổi hoặc viết nó. – qulzam

0

Tôi nghĩ

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

có thể là giải pháp quá.

Các vấn đề liên quan