2017-01-12 23 views
0

Mein Problem ist ziemlich einfach, aber ich weiß nicht, wie man es löst.C# - Erstellen von Instanzen

Mein Code funktioniert, wenn ich bereits bestimmt, wie viele Drohnen erstellt werden.

INICIO

public partial class Inicio : Form 
{ 

    private Drone d1,d2; 
    private Arena arena; 


    public Inicio() 
    { 
     InitializeComponent();   
    } 

    private void btnconetar_Click(object sender, EventArgs e) 
    { 
     d1 = new Drone("192.168.1.10"); 
     d2 = new Drone("192.168.1.20"); 
     arena = new Arena(d1,d2); 

     arena.Show(); 

     this.Hide(); 
    } 


} 

Arena:

public partial class Arena : Form 
{ 
    private Drone d1, d2; 

    public Arena(Drone d1,Drone d2) 
    { 
     InitializeComponent(); 
     this.d1 = d1; 
     this.d2 = d2; 


    } 

    private void cb_drone_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if(cb_drone.SelectedIndex.ToString() == d1.ip_drone) 
     { 
      //do something 
     } 
    } 
} 

Meine Frage ist: Wie kann ich dies tun für n Drohnen? Jedes Mal, wenn ich auf eine Schaltfläche klicke, wird eine neue Drohne hinzugefügt (d3, d4, d5, etc ...) und auf ARENA muss ich prüfen, welches Combobox-Objekt die IP der Drohne ist.

private Drone d1, d2; 

    public Arena(Drone d1,Drone d2) 
    { 
     InitializeComponent(); 
     this.d1 = d1; 
     this.d2 = d2; 


    } 

in diesem Teil des Codes: zum Beispiel, wenn es 10 Fälle von Drone sind geschaffen öffentliche Arena (Drone d1, d2 Drone, Drone d3, etc ...), wie kann ich dies vereinfachen?

EDIT: .............

 List<Drone> lista_drones = new List<Drone>; 
    private Arena arena; 


    public Inicio() 
    { 
     InitializeComponent();   
    } 

    private void Inicio_Load(object sender, EventArgs e) 
    { 

    } 

    private void btnconetar_Click(object sender, EventArgs e) 
    { 
     lista_drones.Add(new Drone("192.168.1.10")); 
     lista_drones.Add(new Drone("192.168.1.20")); 
     arena = new Arena(lista_drones); 

     arena.Show(); 

     this.Hide(); 
    } 


public partial class Arena : Form 
{ 

    public Arena(List<Drone> lista_drones) 
    { 
     InitializeComponent(); 



    } 

    private void cb_drone_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if(cb_drone.SelectedIndex.ToString() ==) 
     { 
      //do something 
     } 
    } 
} 
+5

Verwenden Sie 'List ' anstelle von eindeutigen 'dN' Feldern. –

+1

@DStanley Sie würden wahrscheinlich das in eine Antwort schreiben wollen – cubrr

+0

hm, die funktionieren könnte. Kann ich das etwas besser erklären? Anstatt d1, d2, etc ... zu erstellen, lege ich sie alle auf eine Liste und benutze sie für öffentliche Arena (Liste <> Drohnen) –

Antwort

0

Bitte verwenden Sie ‚params‘ Schlüsselwort in Konstruktor:


public partial class Arena : Form 
{ 
    private readonly Drone[] d; 

    public Arena(params Drone[] d) 
    { 
     InitializeComponent(); 
     this.d = d; 
    } 

    private void cb_drone_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     foreach (var di in this.d) 
     { 
      if(cb_drone.SelectedIndex.ToString() == di.ip_drone) 
      { 
      //do something 
      } 
     } 
    } 
} 

diese Weise können Sie es wie folgt verwenden können (wenn Sie bereits wissen Betrag von sie)


public partial class Inicio : Form 
{ 

    private Drone d1,d2; 
    private Arena arena; 


    public Inicio() 
    { 
     InitializeComponent();   
    } 

    private void btnconetar_Click(object sender, EventArgs e) 
    { 
     d1 = new Drone("192.168.1.10"); 
     d2 = new Drone("192.168.1.20"); 
     .... 
     dn = new Drone("192.168.1.xx"); 
     arena = new Arena(d1,d2); 

     arena.Show(); 

     this.Hide(); 
    } 
} 

oder wenn Sie nicht wissen, wie viele von ihnen


public partial class Inicio : Form 
{ 

    private List d; 
    private Arena arena; 


    public Inicio() 
    { 
     InitializeComponent();   
    } 

    private void btnconetar_Click(object sender, EventArgs e) 
    { 
     d = new List(){ new Drone("192.168.1.10"), /* whatever */ }; 
     arena = new Arena(d.ToArray()); 

     arena.Show(); 

     this.Hide(); 
    } 
} 
+0

sieht gut aus. Ich werde versuchen –

3

Wenn Sie eine unbekannte Anzahl von Drohnen haben, dann wollen Sie eine Sammlung verwenden, anstatt verschiedene Felder eingeben:

public partial class Inicio : Form 
{ 
    private List<Drone> drones; 
    private Arena arena; 
    ... 

public partial class Arena : Form 
{ 
    private List<Drone> drones; 

    public Arena(IEnumerable<Drone> drones) 
    { 
     InitializeComponent(); 
     drones = new List<Drone>(drones); 
    } 
    ... 
+0

thx. Überprüfen Sie meine Bearbeitung bitte. Wie überprüfe ich, ob sich die IP der Drohne auf der Combobox befindet? –

+0

Versuchen Sie linq zu verwenden, wenn Sie die Drohne in der Liste suchen, z. list.Where (x => x.ip_drone == combobox.selected) – mybrave

0

Sie müssen eine Liste von Drohnen haben, so List<Drone> verwenden. Dann passiert diese Liste Ihres Arena:

public partial class Inicio : Form { 

    private List<Drone> drones; 
    private Arena arena; 


    public Inicio() { 
     InitializeComponent(); 
     this.drones = new List<Drone>(); 
    } 

    private void btnconetar_Click(object sender, EventArgs e) { 
     d1 = new Drone("192.168.1.10"); 
     d2 = new Drone("192.168.1.20"); 
     drones.Add(d1); 
     drones.Add(d2); 
     // more drones 

     arena = new Arena(drones); 

     arena.Show(); 

     this.Hide(); 
    } 
} 

In Ihren Arena die Datasource des combobox auf die die List<Drone>. Wenn das Combobox geändert wird, können Sie die SelectedItem erhalten und es wird das Drohnenobjekt ausgewählt haben. Ich zeige auch, wie man die anderen Werte im Code bekommt, wenn Sie sie brauchen. Sie sollten nicht in der Schleife suchen und nach dem ausgewählten Element suchen müssen.

public partial class Arena : Form { 
    private List<Drone> drones; 

    public Arena(List<Drone> drones) { 
     InitializeComponent(); 
     this.drones = drones; 

     cb_drone.DataSource = drones; 

     // This should be whatever the property name is in your drone class 
     cb_drones.ValueMember = "DroneIp"; 

     // THis should be whatever the property name is 
     // in your drone class that you want to display to the user 
     cb_drones.DisplayMember = "DroneSomething"; 

    } 
    private void cb_drone_SelectedIndexChanged(object sender, EventArgs e) { 

     // will give you the drone object 
     var selectedDrone = cb_drone.SelectedItem; 
     // var value = cb_drone.SelectedValue; will give you the Ip (whatever you specified in ValueMember) 
     // var selectedDrone = this.drones.Where(x => x.DroneIp == cb_drone.SelectedValue) 

     //do something with selectedDrone or the other things 
    } 
} 
+0

thxxxxxxxxxxxxx –

+0

Ich bin froh, dass ich helfen konnte. – CodingYoshi

Verwandte Themen