2016-11-17 3 views
1

Ich habe zwei Funktionen mit dem ersten einer comboBox mit den Tabellen in meiner SQL-Datenbank füllen, das darunter:Änderung comboBox Werte basierend auf Klick i ein anderen

private void FillCombo() 
    { 
     comboBox1.Items.Clear(); 
     try 
     { 

      string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True"; 
      using (SqlConnection con2 = new SqlConnection(connectionString)) 
      { 
       con2.Open(); 
       string query = "SELECT * FROM INFORMATION_SCHEMA.TABLES "; 
       SqlCommand cmd2 = new SqlCommand(query, con2); 

       SqlDataReader dr2 = cmd2.ExecuteReader(); 
       while (dr2.Read()) 
       { 
        int col = dr2.GetOrdinal("TABLE_NAME"); 
        comboBox1.Items.Add(dr2[col].ToString()); 
       } 
       comboBox1.SelectedIndex = 0; 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 

Und ich habe ein anderes, das die Füllung zweites ComboBox basierend auf dem Wert aus der Combobox der vorherigen Funktion. Dies ist es unter

async void fillLiguanea() 
    { 
     comboBox2.Items.Clear(); 

      try 
      { 

       string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True"; 
       SqlConnection con = new SqlConnection(connectionString); 
       con.Open(); 
       string query = "SELECT * FROM " + comboBox1.Text; 
       SqlCommand cmd = new SqlCommand(query, con); 
       var reader = await cmd.ExecuteReaderAsync(); 
       comboBox2.BeginUpdate(); 
       while (reader.Read()) 
       { 
        string scode = reader.GetString(reader.GetOrdinal("code")); 
        comboBox2.Items.Add(scode); 
       } 
       comboBox2.EndUpdate(); 
       comboBox2.SelectedIndex = 0; 

      } 
      catch (Exception ex) 
      { 

       MessageBox.Show(ex.ToString()); 
      }} 

Was ist zu tun, ich versuche, die „fillLiguanea“ Funktion des comboBox Wert auf dem Tisch in der „fillCombo“ -Funktion ausgewählt basierend aufzufrischen. Z.B. Wenn es in meiner ComboBox Tabellen mit dem Namen "cat" und "dog" gibt, die mit "fillLiguanea" gefüllt sind, sollte sie bei Auswahl automatisch die comboBox ändern, die von "fillLiguanea" mit den verschiedenen Katzen- oder Hunderassen gefüllt wird.

Ich las und sah etwas über das SelectionChangeCommitted-Ereignis. Ist das der richtige Weg oder gibt es einen besseren Weg?

Ich habe dies durch eine Refresh-Button erreicht, die meinen zweiten comboBox Ziele, aber ich würde die Verwendung von Tasten für den Benutzer

+0

Yup gelöst wurde, würde ich nur eines der folgenden Ereignisse „SelectionChangeCommitted“ oder „SelectedIndexChanged“ oder "SelectedValueChanged". Beachten Sie, dass das Löschen der Combobox keines der oben genannten Ereignisse auslöst. – RoyalPotato

+0

Wie würde ich es aufnehmen? Bin mir nicht sicher über die Umsetzung – Jevon

+0

Ich habe 'if (comboBox1.SelectionChangeCommitted ==)' nicht sicher ist, was – Jevon

Antwort

0

Dies erwies sich als eine einfache Lösung. Ich habe gerade die ComboBox von der fillCombo-Funktion an die fillLiguanea-Funktion übergeben und alles hat funktioniert, wie ich wollte. Die beiden Funktionen sind nachfolgend aufgeführt:

Dies ist die fillCombo Methode, die von der SQL-Datenbank auf meine comboBox namens „comboBox4“

private void FillCombo() 
    { 



      comboBox4.Items.Clear(); 


      try 
      { 

       string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True"; 
       using (SqlConnection con2 = new SqlConnection(connectionString)) 
       { 
        con2.Open(); 
        string query = "SELECT * FROM INFORMATION_SCHEMA.TABLES "; 
        SqlCommand cmd2 = new SqlCommand(query, con2); 

        SqlDataReader dr2 = cmd2.ExecuteReader(); 
        while (dr2.Read()) 
        { 
         int col = dr2.GetOrdinal("TABLE_NAME"); 
         comboBox4.Items.Add(dr2[col].ToString()); 
        } 
        // comboBox4.SelectedIndex = 0; 

       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

Und das ist meine fillLiguanea Methode bevölkert, die in die Tabelle auf der Basis aktualisiert ComboBox4 Auswahl von meiner obigen Funktion.

async void fillLiguanea() 
    { 
     comboBox2.Items.Clear(); 
     try 
     { 

      string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True"; 
      SqlConnection con = new SqlConnection(connectionString); 
      con.Open(); 
      string query = "SELECT * FROM " + comboBox4.Text; 
      SqlCommand cmd = new SqlCommand(query, con); 
      var reader = await cmd.ExecuteReaderAsync(); 
      comboBox2.BeginUpdate(); 
      while (reader.Read()) 
      { 
       string scode = reader.GetString(reader.GetOrdinal("code")); 
       comboBox2.Items.Add(scode); 
      } 
      comboBox2.EndUpdate(); 
      comboBox2.SelectedIndex = 0; 
      // comboBox2.Sorted = true; 
     } 

Dies ist die wichtige Codezeile:

string query = "SELECT * FROM " + comboBox4.Text; 

Damit alles

0

Sie eher beseitigen haben events zu verwenden.

Siehe: https://msdn.microsoft.com/en-us/library/awbftdfh.aspx, https://msdn.microsoft.com/en-us/library/edzehd2t(v=vs.110).aspx

Kurz gesagt, ein Ereignis einfach ein Weg, um Code ausgelöst wird, um die Observer Pattern folgen.

Grundsätzlich stellt ein Ereignis mehrere Methoden dar (ich werde diese als "abonnierende Methoden" bezeichnen, wenn sie das Ereignis "abonnieren"), die alle aufgerufen werden, wenn das Ereignis innerhalb der Klasse ausgelöst wird, in der es definiert ist. "Okay", könnten Sie sagen. Msgstr "Wie stelle ich jedoch sicher, dass ich die richtigen Parametertypen habe, wenn ich eine Methode implementiere, die aufgerufen wird, wenn das Ereignis ausgelöst wird?" Delegates.

Ein Delegat repräsentiert die Signatur einer Methode (dh die Anzahl der Parameter/die Parametertypen/Rückgabetyp der Methode). Jedes Ereignis wird als ein Typ eines bestimmten Delegaten deklariert.

Nehmen wir zum Beispiel an, Sie möchten ein Ereignis, das seine abonnierenden Methoden aufruft, wenn eine beliebige Nachricht empfangen wird. Wie würden Sie ein solches System mit diesen sogenannten "Events" einrichten?

  1. Definieren Sie Ihre Delegierten

    public delegate void MessageDelegate(string data);

    Diese Mittel (und erzwingt), dass alle Ihre Anmeldung Methoden zur Veranstaltung Muss nur einen Parameter enthalten und es den Typ string sein muss. Außerdem muss jede abonnierende Methode keinen Wert zurückgeben.

  2. Definieren Sie Ihre Veranstaltung

    public event MessageDelegate MessageReceived;

    Dies sagt, dass wir ein Ereignis (eine Sammlung von abonnierten Methoden), wobei jede der abonnieren Methode, um die Unterschrift des Delegierten definiert übereinstimmen müssen MessageDelegate erstellen.

  3. abonnieren Ihre Veranstaltung (wahrscheinlich der Teil sind Sie am meisten interessiert) auf das Ereignis abonnieren (oder eine Methode der Sammlung der Veranstaltung hinzufügen von Abonnenten) Sie zunächst eine Methode erstellen müssen, die den Delegierten übereinstimmt:

    private void OnMessageReceived(string msg) { //Do something with the received message. }

    Dann kommt die eigentliche zeichn:

    MessageReceived += new MessageDelegate(OnMessageReceived).

    Jetzt, wenn das Ereignis ausgelöst wird, wird unsere OnMessageReceived Methode aufgerufen.

  4. Schließlich auslösen oder Erhöhung das Ereignis (der Prozess jedes Abonnement Methode des Aufrufs) Sie einfach tun: MessageReceived("Hello World!")

, dass alle gesagt wird, wie dies zu Ihrem speziellen Problem gilt? Nun, das Combobox-Steuerelement enthält bereits das Ereignis. Sie müssen das natürlich nicht selbst definieren. Das bedeutet, dass Sie nur für die Teilnahme am Event verantwortlich sind.

comboBox1.SelectionChangeCommitted += new EventHandler(comboBox1_SelectionChangeCommitted); 

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
    //Refresh combobox 2. 
} 

Ich empfehle Ihnen, stellen die eigentliche Abonnement in der -Ereignis des Formulars.

private void Form1_Load(object sender, EventArgs e) 
{ 
    comboBox1.SelectionChangeCommitted += new EventHandler(comboBox1_SelectionChangeCommitted); 
} 

Nun müssen Sie jedoch das Ladeereignis des Formulars abonnieren. In der Regel im Konstruktor nach der Anruf an InitializeComponent getan.

public Form1() 
{ 
    InitializeComponent(); 
    Load += new EventHandler(Form1_Load); 
} 

Sie können natürlich, umgehen Sie das Formular Last Abonnement

public Form1() 
{ 
    InitializeComponent(); 
    comboBox1.SelectionChangeCommitted += new EventHandler(comboBox1_SelectionChangeCommitted); 
} 

Schließlich, wenn Sie den Windows Designer in Visual Studio verwenden: Irgendwo auf dem Eigenschaftsfenster sollte es eine Möglichkeit sein, Ereignisse für das ausgewählte Steuerelement anzeigen Scrollen Sie nach unten zum gewünschten Ereignis. Doppelklicken Sie darauf. Visual Studio sollte automatisch eine Methode erstellen und das Ereignis mit der neuen Methode abonnieren.

Es gibt so viel Macht hinter Ereignissen und Delegierten. Ich ermutige Sie sehr, etwas darüber zu lesen. Entschuldigung, das war nicht so klein, wie ich mir vorgestellt habe, aber ich dachte, ich würde versuchen, zu erklären, warum es funktioniert und nicht nur "So soll es gemacht werden.".

Verwandte Themen