2016-05-12 17 views
0

Ich habe seit Wochen versucht, das herauszufinden.Dynamisch wechselndes Bild im Bild funktioniert nicht

In meiner VB 2010 Forms-Anwendung habe ich eine Anzahl von Bildfeldern, die mit Bildern aus anderen Bildfeldern mit der Drag-and-Drop-Methode gefüllt werden. Das ist kein Problem, es funktioniert gut. Die Bildfelder befinden sich alle in einem Sammelbehälter.

Das Problem besteht darin, Bilder zwischen zwei Bildfeldern bei einer Drag-and-Drop-Operation auszutauschen. Mit anderen Worten: pBox1 hat image.x und pBox2 hat image.y. Ziehen Sie das Bild von pBox2 zu pBox1 und legen Sie es ab; pBox1 wird dann image.y von pBox2 haben und pBox2 wird image.x von pBox1 haben.

Mit diesem Beispiel hier ist der Code, den ich bisher habe:

Private Sub pBox2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pBox1.MouseDown 
    strImageSource = "pBox2" 'strImageSource is a global string variable 
    [other stuff] 
end sub 

^Das spart den Namen des Quellbildfeldes zu einem globalen String.

Private Sub pBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles pBox1.DragDrop 
    For Each Control as PictureBox in GroupBox1.Controls.OfType(of PictureBox)() 
    if Control.Name = strImageSource then 
     Control.Image = pBox1.Image 
    end if 
    next 

    dim imgTarget as Image = CType((e.Data.GetData(DataFormats.Bitmap)), Bitmap) 
    pBox1.image = imgTarget 
End Sub 

^Dies sucht nach dem Bildfeld, wie durch die strImageSource („pBox2“) genannt und kopiert den Inhalt von pBox1 hinein, und dann fällt das Bild, das in pBox2 in pBox1 war.

Ich hoffe, das macht Sinn.

Damit wird das Bild von pBox2 korrekt in pBox1 platziert, aber das Bild wird nicht von pBox1 in pBox2 umgeschaltet. pBox2 ist nur leer. Das Debugging zeigt jedoch, dass das Bild in pBox2 nicht nichts ist; Es enthält eine Bitmap. Es ist einfach nicht sichtbar. Jetzt

, nur als Test, habe ich eine Linie auf dem für jeden Abschnitt, den die Hintergrundfarbe des Bildfeldes ändern würde:

For Each Control as PictureBox in GroupBox1.Controls.OfType(of PictureBox)() 
    if Control.Name = strImageSource then 
    Control.Image = pBox1.Image 
    Control.BackColor = color.red 
    end if 
next 

Und die Hintergrundfarbe ändert. Das sagt mir, dass der Abschnitt For Each funktioniert - es findet das Steuerelement und ändert die Hintergrundfarbe. Es zeigt nur nicht das Bild.

Gibt es etwas, das ich übersehe?

Danke!

+0

Wir haben keine Ahnung, was Sie in 'DoDragDrop' machen.Es sieht so aus, als hätten Sie Ihre eigene Methode mit dieser globalen Zeichenfolge gerollt. – Plutonix

Antwort

0

Sie sollten Control.Refresh() auf den PictureBox-Steuerelementen aufrufen, um die Bilder zu aktualisieren.

+0

Dies liefert keine Antwort auf die Frage. Sobald Sie genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) haben, können Sie [jeden Beitrag kommentieren] (http://stackoverflow.com/help/privileges/comment); stattdessen [geben Sie Antworten, die keine Klärung durch den Fragesteller erfordern] (http://meta.stackexchange.com/questions/214173/why-doe-i-need-50-reputation-to-comment-what-can- i-do-stattdessen). - [Aus Bewertung] (/ review/low-quality-posts/12335118) – isedev

+0

@isedev Nein, es beantwortet die Frage. Nicht sicher über die technische Genauigkeit, aber es entspricht der Problembeschreibung. – CherryDT

0

Statt strImageSource der Verwendung einer globalen Variablen als Picturebox definiert verwenden

Private tmpPictureBox As PictureBox

speichern dann, dass picturebox Referenz, so dass Sie ihr Bild auf Drag & Drop-Set kann

Private Sub pBox2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pBox1.MouseDown 
    'store the picturebox reference 
    tmpPictureBox = sender 
    [other stuff] 
end sub 

Private Sub pBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles pBox1.DragDrop 
    'set the first image to the second 
    tmpPictureBox.Image = sender.image 

    'set the second image to the first 
    pBox1.image = CType((e.Data.GetData(DataFormats.Bitmap)), Bitmap) 
End Sub 
+0

Danke, Chase. Ich hatte auch daran gedacht und es versucht, aber es hat nicht funktioniert. Ich habe tatsächlich eine temporäre Bildbox eingerichtet und konnte sehen, dass das Bild darin angezeigt wurde. Es wird nur nicht in der Zielbox angezeigt. –

0

OK, das war blöd.

Ich machte alles richtig mit einer wirklich knochenharten Ausnahme. In einem anderen Teil des Codes, unerklärlicherweise, löschte ich die Bildfelder des Inhalts, nachdem das Bild ersetzt wurde. Es könnte ein Überrest von etwas gewesen sein, was ich versuchte, ohne Bezug zu diesem Problem, und ich korrigierte es nie.

Ich entschuldige mich dafür und danke für alle Antworten.

Verwandte Themen