2017-11-19 8 views
0

Gibt es eine Möglichkeit, dass ich eine Variable verwenden kann, um zu steuern, welche PictureBox ich in Visual Basic verwende?Kann ich mit Variablen steuern, welche PictureBox ich verwende?

d.h .:

CurrentNumber = 1  
PictureBox(CurrentNumber).backcolour = backcolour 
+0

Bitte ausführlicher über Ihre Fragen, dh mehr Kontext geben, wie die Sprache angeben, die Sie verwenden in die Frage. –

+0

Kontext hinzugefügt - Ich verwende Visual Basic. –

Antwort

1

Sie können den Me.Controls(String) Indexer verwenden. Sie können den Namen (als String) des Steuerelements angeben, auf das Sie zugreifen möchten. Auf diese Weise können Sie dynamisch auf ein Bildfeld zugreifen, indem Sie die Zeichenfolge "PictureBox" mit einer Zahl verketten.

Dim TargetPictureBox As PictureBox = TryCast(Me.Controls("PictureBox" & CurrentNumber), PictureBox) 

'Verifying that the control exists and that it was indeed a PictureBox. 
If TargetPictureBox IsNot Nothing Then 
    TargetPictureBox.BackColor = Color.Red 
End If 

Alternativ Verarbeitungsleistung zu sparen, indem jedes Mal Schleife durch die gesamte Steuer Sammlung vermeiden Sie die OfType() extension auf Me.Controls nennen kann, ist das Ergebnis in einem Array Speicherung durch die Kontrollen die Namen sortiert. Auf diese Weise müsste die Kontrollsammlung nur einmal durchlaufen werden.

'Class level - outside any methods (subs or functions). 
Dim PictureBoxes As PictureBox() = Nothing 

'Doesn't necessarily have to be done in a button, it's just an example. 
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    If PictureBoxes Is Nothing Then 
     PictureBoxes = Me.Controls.OfType(Of PictureBox).OrderBy(Function(p As PictureBox) p.Name).ToArray() 
    End If 

    'NOTE: CurrentNumber - 1 is necessary when using an array! 
    PictureBoxes(CurrentNumber - 1).BackColor = Color.Red 
End Sub 

HINWEIS: Diese Lösung wird nur funktionieren, wenn alle Bildrahmen genannt werden „PictureBox1“, „PictureBox2“ usw. Wenn Sie plötzlich eine Nummer („PictureBox3“, „PictureBox5“ überspringen " PictureBox6 ") dann PictureBoxes(CurrentNumber - 1) für CurrentNumber = 5 würde PictureBox6 anstatt PictureBox5 zurückgeben.

0

Überprüfen Sie die API docs für die PictureBox Klasse, gibt es einige Beispiele.

Ich wusste kaum etwas über VB, aber der Konstruktor New PictureBox gibt eine Instanz der PictureBox-Klasse zurück, die Sie als Variable verfolgen können.

So etwas wie

Dim my_pic_box = New PictureBox 
my_pic_box.BackColor = some_background_color 

aber Sie wollen wahrscheinlich eine Reihe von PictureBox s, so etwas wie:

Dim picboxs(2) As PictureBox 
picboxes(0) = New PictureBox 
picboxes(0).BackColor = some_background_color 
picboxes(1) = New PictureBox 
picboxes(1).BackColor = some_background_color2 

Im Falle der Anordnung einer Schleife besser wäre. Hängt davon ab, wie Sie diese Objekte verwenden. Wenn es sich um beschriftete Teile einer Benutzeroberfläche handelt, würde ich sie nicht in ein Array einfügen, sondern mache sie einfach zu individuellen Dim s. Wenn Sie sie auf der Grundlage einer anderen Eingabe generieren und sich die Anzahl zur Laufzeit ändert, verwenden Sie ein Array.

1

Was Sie wirklich tun sollten, ist eine PictureBox() erstellen und damit Ihre Bild-Boxen über einen Index verweisen.

Die beste Methode zum Erstellen eines Arrays besteht darin, eine Methode zu erstellen, mit der das Array anhand der vom Designer erstellten Referenzen erstellt wird. Auf diese Weise können Sie den Designer weiterhin zum Erstellen Ihrer Steuerelemente verwenden, und der Code wird zur Entwurfszeit auf gelöschte Steuerelemente überprüft. Die Verwendung von Me.Controls(...) leidet unter Laufzeitfehlern, wenn die gesuchten Steuerelemente gelöscht wurden.

Hier ist der Code, den Sie benötigen:

Private _PictureBoxes As PictureBox() = Nothing 

Sub AssignPictureBoxesArray 
    _PictureBoxes = {PictureBox1, PictureBox2, PictureBox3} 
End Sub 

Dann können Sie sie wie folgt zugreifen:

Sub SomeMethod 
    Dim CurrentNumber = 1 
    Dim PictureBox = _PictureBoxes(CurrentNumber - 1) 
    PictureBox.BackColor = System.Drawing.Color.Red 
End Sub 
Verwandte Themen