Announcement

Collapse
No announcement yet.

Automatisches Hinzufügen zu ConboBox

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Automatisches Hinzufügen zu ConboBox

    Hallo zusammen!

    Ich würde gerne beim Starten meines Projekts überprüfe, ob das aktuelle Jahr bereits in der entsprechenden ComboBox enthalten ist und falls nicht die Jahreszahl als string hinzufügen lassen. Leider habe ich kein Idee wie ich das genau anstellen könnte. Wahrscheinlich irgendwie mit cmbJahr.Items.Contains?

  • #2
    [Highlight=C#]List<int> jahre = new List<int> { 1999, 2000, 2001, 2002, 2003, 2010, 2050, 2099 };
    if (!jahre.Contains(DateTime.Now.Year))
    jahre.Add(DateTime.Now.Year);
    meineLiebeComboBox.DataSource = jahre;
    [/Highlight]

    Comment


    • #3
      Warum ist die List<int> dafür nötig? Hab mal testweise versucht direkt die ComboBox nach dem Element zu prüfen, hatte dann aber 2x "2011"? Nur damit ich das auch verstehe...

      Comment


      • #4
        Der List<> kann man dann doch bestimmt auch die Jahre hinzufügen, die schon in einer Tabelle vorhanden sind, oder?
        Mein Versuch:

        [highlight=c#]cmd.CommandText = "SELECT YEAR(Datum) FROM Stunden GROUP BY YEAR(Datum)";
        return Convert.ToInt32(cmd.ExecuteScalar());[/highlight]

        Ich nehme mal an, dass "ExecuteScalar" hier aber nicht das gewünschte Ergebnis liefert...

        Comment


        • #5
          Die List<> ist nicht erforderlich sie war nur als Beispiel gedacht das man das besser an der Datenquelle löst uns nicht am Control.

          Dein SQL würde ich als

          Code:
          SELECT DISTINCT YEAR(Datum) FROM Stunden
          schreiben. Wenn du das aktuelle Jahr dazu haben willst kannst du das in SQL erledigen.

          Code:
          SELECT DISTINCT YEAR(Datum) FROM Stunden
          UNION
          SELECT YEAR(GetDate())
          Oder eben nachträglich wie gezeigt an deine tatsächliche Datenmenge anhängen was immer die auch ist (List<T>,DataTable etc.)

          ExecuteScalar ist tatsächlich ungeeignet. Wenn du mal in die Hilfe geschaut hättest wäre dir aufgefallen das das genau für einen Wert gedacht ist (also wenn das Ergebnis aus 1 Spalte mit 1 Row besteht). Das ist bei deinem Select nicht der Fall du bekommst da ja wieder n Werte. Also entweder mit ExecuteReader() einen DataReader ranholen, diesen über die Daten iterieren lassen und eine Liste füllen oder eine DataAdapter erzeugen und sich eine DataTable geben lassen. So wie wir das hier schon mal an anderer Stelle durchexerziert haben.

          Comment


          • #6
            Das ist mir klar, deswegen sagte ich ja, dass ExecuteScalar hier nicht zum Ergebnis führt, habe ich vielleicht zu undeutlich formuliert.

            Comment


            • #7
              Ich hab das jetzt mal so in die bereits vorhandene Klasse geschrieben:

              [highlight=c#] public static DataTable getYears()
              {
              using (OleDbConnection con = getConnection())
              {
              con.Open();
              using (OleDbCommand cmd = con.CreateCommand())
              {
              cmd.CommandText = "SELECT DISTINCT YEAR(Datum) FROM Stunden";
              return getDataTable(cmd);
              }

              }
              }[/highlight]

              In der Form habe ich eine DataTable jahre, welche die obige Methode aufruft und die in der Tabelle aufgeführten Jahre erhalten soll. Die cmbYear hat als DataSource "jahre".

              Die Anzeige in der cmbYear lautet: System.Data.DataRowView

              Comment


              • #8
                Beim DataBinding musst du den DataMember der Combobox noch setzen. Beim obigen Beispiel mit List<int> war das unnötig weil das enthaltenen Object ja genau einen Wert darstellt. Und Int.ToString() einne lesbaren Wert liefert. Deine DataTable enthält aber eine DataRow die üblicherweise mehr als eine Spalte hat un dsomit muß man dann sagen welche Spalte denn angezeigt werden soll. Sonst wird halt auch einfach ToString() des Object aufgerufen was bei komplexen Objecten halt den Objectnamen liefert. Du musst also den Spaltennamen in die DataMember Property schreiben wenn du eine DataTable bindest. Wie der Spaltenname bei einer Aggregatfunktion ermittelt wird hab ich jetzt gerade auch nicht auf der Pfanne (Vielleicht einfach "Datum"?). Entweder die Spalte in SQL explizit einen Namen geben denn du dann im Code benutzt oder mal einfach mit dem Debugger nachschauen welcher Spaltenname den in der DataTable steckt.

                Comment


                • #9
                  oha.... Ich vermute jetzt mal dass mit DataMember die Eigenschaft DisplyMember gemeint ist.
                  Es funktioniert so jedenfalls:

                  [highlight=c#]cmbYear.DataSource = jahre;
                  cmbYear.DisplayMember = jahre.Columns[0].ToString();[/highlight]

                  Müsste ja die Spalte "0" auch sein, da ich ja schon nur die Spalte Datum in SQL angebe "YEAR(Datum)". Korrigiere mich bitte falls ich irre.

                  Comment


                  • #10
                    Nein, kein Gund zur Korrektur. Du hast vollkommen recht.

                    Comment


                    • #11
                      Naja, irgendwann muss ja auch bei mir mal was fruchten

                      Comment

                      Working...
                      X