DropDown in ContextMenuStrip füllen

real-insanity

Erfahrenes Mitglied
DropDown in ContextMenuStrip füllen & auswählen

Hallo zusammen,

ich hab da mal ein etwas kniffeligeres Problem(chen).
Aktuell baue ich an einer CD-Verwaltung für DJs, da ich diese auch selbst benötige und mir viel Arbeit abnimmt.
Zur zeit arbeite ich an einem Showplaner, mit dem ich meine Shos, Gigs etc planen kann.
Suche ich nun einen Track, kann ich diesen via Rechtsklick zu einer Show hinzufügen um später dann Tracklisten einer Show erstellen zu können. (Bilder zum Verständnis sind angefügt).

In diesem ContextMenu befindet sich eine DropDown mit den angelegten Shows die beim DropDown (cboShows_DropDown) gefüllt wird:

Code:
private void cboShows_DropDown(object sender, EventArgs e)
        {
            DataSet Shows = DataBaseHelper.LoadData("SELECT Shows.ID, Shows.Name  FROM Shows WHERE Shows.DateTimeFrom >= datetime() ORDER BY Shows.DateTimeFrom");
            cboShows.ComboBox.BindingContext = this.BindingContext;
            if (Shows.Tables.Count > 0)
            {
                cboShows.ComboBox.DataSource = Shows.Tables[0];
                cboShows.ComboBox.DisplayMember = "Name";
                cboShows.ComboBox.ValueMember = "ID";
            }
        }

Das blöde ist nun, dass ich beim Auswählen der Show aus der Dropdown den Track in die DB schreibe:
Code:
 private void cboShows_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboShows.Items.Count > 0)
            {
                //DataBaseHelper.ExecuteQuery("INSERT INTO Shows_Tracks(FK_Track_ID, FK_Show_ID, DateTime) VALUES(" + dgvSearchResult.Rows[selectedRow].Cells["ID"].Value.ToString() + "," + ((System.Data.DataRowView)cboShows.SelectedItem).Row.ItemArray[0].ToString() + ",datetime());");
            }
        }

Somit kommen sich die Events _DropDown und _SelectedIndexChanged in die Quere.
Klicke ich eine Show an, wird der Datensatz zweimal gespeichert.

Leider beiß ich mir daran die Zähne aus und weiß nicht mehr weiter.
Eventuell hat einer von Euch einen guten Ratschlag.

Lieben Gruß vom Niederrhein
 

Anhänge

  • Track_speichern.png
    Track_speichern.png
    83,6 KB · Aufrufe: 16
Zuletzt bearbeitet:
Hi

Du solltest das nicht in dem Event regeln sondern das Persitieren vom Benutzer anfordern (oder dann, wenn du definitiv sicher sein kannst, dass die Auswahl fertig ist).
Grund: wenn wir davon ausgehen, dass in der Liste mehrere Shows angezeigt werden können (sonst würde die ComboBox ja auch keinen Sinn ergeben), hat man die Möglichkeit die Auswahl immer wieder zu wechsel. Sei es per Click in die DropDownList oder per Scrollrad. Du würdest dann jedes Mal an die DB gehen, obwohl die Auswahl ggf. gar nicht persistiert werden soll.

Ähnliches gilt für das Laden der List.
Aus meiner Sicht ändert die sich relativ selten. Diese solltest du also nicht jedes Mal aus der DB laden sondern nur einmal und cachen (ggf. bei neuen Shows aktualisieren)

PS: Die Erzeugung des Insert-Statements ist sehr fehleranfällig und schlecht wartbar. Du sollte hier ein paar mehr Zeilen nutzen! :)
 
ich hatte mir sogar überlegt, die DropDown komplett aus dem ContextMenu zu nehmen und woanders hinein zu bauen um im Strip sagen zu können "Zu Show hinzufügen".
Vorher muss der Benutzer dann eine Show (von mir aus im MenuStrip) auswählen. Meinst du, das wäre ein gangbarer Weg?

Die SQL-Statements werde ich sowieso noch als eigene Methode in meinen DB-Helper auslagern und dann einfach voa DBHelper.InsertTrack(bla,foo, bar) aufrufen.
 
Zuletzt bearbeitet:
Hi

Das wäre eine Option. Bedenke aber, dass man ggf. einen Track zu mehreren Shows hinzufügen will.
Schau dir doch mal die neue Listenverwaltung von Facebook oder die Circles von Google+ an. Das wäre ähnlich wie bei dir (Freund = Tracks; Listen/Circles = Shows)
 

Neue Beiträge

Zurück