2016-04-11 53 views
2
Ben küçük Reversi/Othello oyunu yapıyorum

içinde ve iç Resmi güncellenemiyor.döngü görüntüleriyle ilgili PictureBoxes her bir kılavuz görüntülemek için ben iç içe geçmiş bir var kurulu çizim benim yöntemiyle PictureBox

ilk Metodu çağrıldığında tüm PictureBox'lar doğru şekilde oluşturulmuş ve içerisine yerleştirilmiş görüntüler. Ancak, daha sonra yöntemi tekrar ararsam, zaten var olan görüntülerin üzerine yazamıyorum.

Bir süredir araştırıyordum ve anladığım kadarıyla PictureBox'ın kilitli kalması veya doğru bir şekilde başka bir görüntü yazmadan önce PictureBox'u doğru şekilde atması gerekiyor. Çalışmak için bu çözümlerden hiçbirini alamadım, böylece herhangi bir yardım çok takdir edilecek!

private void Draw() 
{ 
    Bitmap White = Properties.Resources.white; 
    Bitmap Black = Properties.Resources.black; 
    Bitmap None = Properties.Resources.none; 

    for (int r = 0; r <= grid.GetUpperBound(0); r++) 
    { 
     for (int c = 0; c <= grid.GetUpperBound(0); c++) 
     { 
      if (grid[r, c].value == 1) 
      { 
       var picbox = new PictureBox()    // initialise picturebox for displaying images 
       { 
        Name = grid[r, c].name, 
        Size = new Size(64, 64), 
        Location = new Point(r * 65 + 15, c * 65 + 60), 
        Text = grid[r, c].name, 
        Image = White 
       }; 

       Controls.Add(picbox);    // add picturebox to form 
       picbox.Click += ClickBox; 
       MessageBox.Show("white draw" + grid[r, c].name); 
      } 

      if (grid[r, c].value == -1) 
      { 
       var picbox = new PictureBox() 
       { 
        Name = grid[r, c].name, 
        Size = new Size(64, 64), 
        Location = new Point(r * 65 + 15, c * 65 + 60), 
        Text = grid[r, c].name, 
        Image = Black 
       }; 

       Controls.Add(picbox); 
       picbox.Click += ClickBox; 
       MessageBox.Show("black draw" + grid[r, c].name); 
      } 

      if (grid[r, c].value == 0) 
      { 
       var picbox = new PictureBox() 
       { 
        Name = grid[r, c].name, 
        Size = new Size(64, 64), 
        Location = new Point(r * 65 + 15, c * 65 + 60), 
        Text = grid[r, c].name, 
        Image = None 
       }; 

       Controls.Add(picbox); 
       picbox.Click += ClickBox; 
      } 
     } 
    } 
} 
+0

kullanarak güncelleştirmek için resim kutusunu bulabilirsiniz gibi

private Dictionary<int, Bitmap> colors = new Dictionary<int, Bitmap>(); private void Load() { Bitmap White = Properties.Resources.white; Bitmap Black = Properties.Resources.black; Bitmap None = Properties.Resources.none; colors.Add(1, White); colors.Add(-1, Black); colors.Add(0, None); } 

Yani yöntem bakacağız nasıl bütün yöntemi gösterebilir misin? – Valentin

+0

Elbette! Tüm yöntemi eklemek için düzenlenmiştir. – MBrazier4

+0

Ve 'ızgara' nedir? – Valentin

cevap

3

sorun yeni Picturebox oluşturmak ama Controls mevcut resim kutusunu güncellemek/kaldırmak kalmamasıdır. Her şeyden önce, güncellemek veya Controls'dan kaldırmak istediğiniz bir fotoğraf kutusu bulmanız gerekiyor.

Resim kutularının bir ızgarasını oluşturmanızı öneririm, böylece resim kutusunu ızgaradan alabilirsiniz. Her şeyden önce alanı yaratın.

private var pictureGrid = new PictureBox[8, 8]; 

Sonra

if (grid[r, c].value == 1) 
{ 
    if (pictureGrid[r,c] != null) 
    { 
     pictureGrid[r,c].Image = White; 
    } 
    else 
    { 
     var picbox = new PictureBox()     
     { 
      Name = grid[r, c].name, 
      Size = new Size(64, 64), 
      Location = new Point(r * 65 + 15, c * 65 + 60), 
      Text = grid[r, c].name, 
      Image = White 
     }; 

     pictureGrid[r,c] = picbox; 
     Controls.Add(picbox);     
     picbox.Click += ClickBox; 
     MessageBox.Show("white draw" + grid[r, c].name); 
    } 
} 

Ayrıca içerdiği Dictionary kullanabilirsiniz (grid.Value - Renk) çiftleri. Ayrıca

private var pictureGrid = new PictureBox[8, 8];  
private Dictionary<int, Bitmap> colors = new Dictionary<int, Bitmap>(); 

private void Load() 
{ 
    Bitmap White = Properties.Resources.white; 
    Bitmap Black = Properties.Resources.black; 
    Bitmap None = Properties.Resources.none; 

    colors.Add(1, White); 
    colors.Add(-1, Black); 
    colors.Add(0, None); 
} 

private void Draw() 
{ 
    for (int r = 0; r <= grid.GetUpperBound(0); r++) 
    { 
     for (int c = 0; c <= grid.GetUpperBound(0); c++) 
     { 
      if (pictureGrid[r, c] != null) 
      { 
       pictureGrid[r,c].Image = colors[grid[r,c]]; 
      } 

      else 
      { 
       var picbox = new PictureBox() 
       { 
        Name = grid[r, c].name, 
        Size = new Size(64, 64), 
        Location = new Point(r * 65 + 15, c * 65 + 60), 
        Text = grid[r, c].name, 
        Image = colors[grid[r,c]] 
       }; 

       pictureGrid[r,c] = picbox; 
       Controls.Add(picbox); 
       picbox.Click += ClickBox; 
       MessageBox.Show("black draw" + grid[r, c].name); 

      } 

     } 
    } 
} 

Eğer linq

var pictureToRemove = this.Controls.OfType<PictureBox>().Where(x => x.Location.X == r * 65 + 15 && x.Location.Y == c * 65 + 60).First(); 
+0

Gelecekte tekrar kullanmak istemediğiniz sürece Kaldırmayın, Kaldırmayın. – LarsTech

+0

Ah Ne demek istediğini anlıyorum! Bu bir noob sorusu olabilir ama oluşturduğum resim kutularına nasıl başvurabilirim? sadece 'picbox' kullanırsam, ismin mevcut bağlamda mevcut olmadığını söyler. Tüm yardımlarınız için teşekkürler btw! – MBrazier4

+0

@ MBrazier4 Cevabı güncelledik. Resim kutularının ızgarası ile çözümün en mantıklı olduğunu düşünüyorum. – Valentin