Autor Beitrag
Parn
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 04.04.12 14:38 
Hallo,
ich beschäftige mich zum ersten mal intensiver mit C# und bin hier an meine Grenzen gestoßen.
Ich hoffe, ihr könnt mir hier weiterhelfen.

Ich habe ein Programm geschrieben, das Zugriff auf eine MS Access Datenbank hat. Die Datenbank beinhaltet mehrere Tabellen.

Nun will 2 ComboBoxen mit je einer Spalte aus einer dieser Tabellen füllen. Dazu habe ich im "Datenbindungsmodus" eine "Datenquelle" eingetragen und ein "Member" ausgewählt.

Dies funktioniert soweit auch. Das Problem ist jedoch, dass Doppelnennungen möglich sind und die zweite ComboBox immer alle Namen zeigt.

Nehmen wir als Beispiel zum besseren Verständnis also an, dass die Tabelle wie folgt aussieht:

NAME VORNAME
Geiger Ingrid
Meierl Thomas
Dester Tobias
Geiger Stefan

Ich möchte nun, dass in der ersten Combobox folgendes zur Wahl steht:

Geiger
Meierl
Dester

Wenn man nun "Geiger" auswählt, soll in der zweiten ComboBox nur noch "Ingrid" und "Stefan" zur Wahl stehen.
Sollte "Meierl" gewählt werden, sollte in der zweiten Box automatisch nur noch "Thomas" angeboten werden.

Ich freue mich auf jede konstruktive Antwort!
mfg Parn
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 04.04.12 16:27 
Hallo parn :welcome:

mit welcher Technologie greifst du denn auf die Datenbank zu (ADO.NET, Linq2Sql, ...)?
Wenn du direkt mit SQL arbeitest, so kannst du mittels
ausblenden SQL-Anweisung
1:
SELECT DISTINCT Name FROM Tabelle					

dir alle doppelten Namen rausfiltern lassen.

Um dann in der 2. ComboBox nur noch die zugehörigen Vornamen anzeigen zu lassen, solltest du im SelectedIndex-Ereignis der ersten ComboBox (Name) diese entsprechend filtern:
ausblenden SQL-Anweisung
1:
SELECT Vorname FROM Tabelle WHERE Name = :Name					

(:Name ist dabei der ausgewählte Name - arbeite hierzu am besten mittels SQL: Parameter von Befehlen).

Wenn du nicht weiterkommst, so darfst du auch gerne etwas (relevanten) Code zeigen.

Für diesen Beitrag haben gedankt: Parn
Parn Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 04.04.12 17:25 
Hallo und danke für die Antwort.
Ich arbeite mit SQL. Und ich habe mit DISTINCT auch schon versucht hinzukommen.

relevanten Code kann ich hierzu nicht wirklich angeben, da ich das ja an der ComboBox einstelle(n will).

die SQL Anweisung ist bisher:
ausblenden SQL-Anweisung
1:
2:
SELECT Name, Vorname, Wohnort, ID
FROM         Mitglieder

Ich habe bei beiden ComboBoxen "An Daten gebundene Elemente anbinden" angekreuzt und da dann als Datenquelle "MitgliederBindingSource" ausgewählt. Bei der ersten Box entsprechend "Name", bei der 2. "Vorname".
Nun stehen da aber eben in der ersten Box auch doppelte Einträge und in der zweiten alle, unabhängig von dem, was in der ersten angeklickt ist.

Wenn ich jetzt "SELECT DISTINCT Name FROM Mitglieder" nutze, dann funktioniert "Insert, Update und Delete" nicht mehr (vermutlich weil ich dazu alle Spalten ausgewählt haben muss, was ich mit "SELECT DISTINCT Name" ja automatisch nicht habe), was ich aber intensiv nutze...

Das muss doch einfacher zu handeln sein?

Moderiert von user profile iconTh69: SQL-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 04.04.12 17:35 
Nein, einfacher geht es nicht - du brauchst schon für jede Situation eine eigene Datenquelle (d.h. einen entsprechenden SQL-Befehl).
Alternativ könntest du verschiedene BindingSources verwenden (und dort dann Filterung sowie Sortierung anders behandeln).

Für diesen Beitrag haben gedankt: Parn
Parn Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 05.04.12 11:15 
Hallo noch mal,
ich habe es nun mit mehrerern Datenquellen so hingekriegt, dass die erste ComboBox sortiert wird, und auch keine Doppelnennungen mehr auftreten.

Bei der zweiten ComboBox funktioniert die Abfrage aber nicht wie gewünscht. Ist sicher nur ne Kleinigkeit in der Syntax, aber ich komme einfach nicht drauf.

Derzeit sieht es bei der zweiten ComboBox so aus:
ausblenden SQL-Anweisung
1:
2:
3:
4:
SELECT     Vorname
FROM       Mitglieder
WHERE     (Name = 'ComboBox1.Text')
ORDER BY Vorname


Das Funktioniert aber leider nicht. Wenn ich aber nun
ausblenden SQL-Anweisung
1:
2:
3:
4:
SELECT     Vorname
FROM       Mitglieder
WHERE     (Name = 'Maier')
ORDER BY Vorname

schreibe, dann geht es für "Maier". D.h. wohl, dass ich falsch auf den Text in der ersten ComboBox zugreife?

Danke für eure Hilfe!

Moderiert von user profile iconTh69: SQL-Tags hinzugefügt
lothi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: Do 05.04.12 12:20 
Hallo Parn

Arbeite mit Parameter wie oben schon gesagt und verlinkt.
Benutze den Debugger, dann siehst du auch was du dem SQL-String übergibst.

Dein 1. SQL-Befehl würde funktionieren wenn in deiner Tabelle ein Name "ComboBox1.Text" existieren würde.
Wegen den '' übergibst du nicht den Inhalt sondern die Beschreibung ComboBox1.Text. Du musst den den Text auslesen und diesen dann in '' eingebettet dem SQL_String hinzufügen, was aber wenn du mit Parameter arbeitest dir ADO.Net abnehmen würde.

Gruss Lothi

Für diesen Beitrag haben gedankt: Parn
Parn Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 10.04.12 17:03 
Hallo,
Danke nochmal für eure Hilfe, ich habe es jetzt mehr schlecht als recht hingebracht ;)
mfg Parn