Autor Beitrag
flyhigh83
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 7
C# (VS2010)
BeitragVerfasst: Mo 08.11.10 14:43 
Hallo,

ich stehe gerade vor einem Designerischen und Codetechnischen Problem.

Ich habe eine ComboBox über welche ich verschiedene Werte auswählen kann.
Die Werten sind über eine Relation verknüpft und werden in der Tabelle für das Form gespeichert.

Jetzt ist es so. Die ComboBox also die Werte die sich dahinter verstecken können verschiedene Werte annehmen.
Ein Wert wäre die ID also für die Daten der Verknüpfung. Es kann aber auch sein das keine Verknüpfung besteht.

In der Datenbank muss die Verknüpfung keinen Wert annehmen. Default ist der wert NULL.

Jetzt habe ich aber ein Problem. Ich will am besten oben in der Kombobox eine Auswahl anzeigen "leer" oder irgend sowas.
was den Wert "NULL" hätte für die Speicherung.

Beispiel Tabelle vor der Änderung
Tabelle 1 Tabelle 2
ID Name ID Kind Tabelle1_ID
1 Mustermann 1 Musterkind 1 2
2 Musterfrau 2 Musterkind 2 2

Beispiel Tabelle nach der Änderung
Tabelle 1 Tabelle 2
ID Name ID Kind Tabelle1_ID
1 Mustermann 1 Musterkind 1 2
2 Musterfrau 2 Musterkind 2 NULL

Wie ihr setzt das "Musterkind 2" hat keine Verbindung mehr zu der Tabelle 1. Wichtig ist aber was bei diesem Beispiel nicht rauskommt. Es macht sinn das Kind weiter existieren zu lassen.


Frage:

Wie löse ich dies am geschicktesten, das ich in der Kombobox nachdem mal eine Verknüpfung zur Tabelle 1 hergestellt war diese Wieder zu löschen, da meine Kombobox mir nur die Werte "Mustermann | Musterfrau" ausgibt habe ich nicht wirklich die möglichkeit über die Kombobox dies zu ändern. Wie geht das?
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mo 08.11.10 15:23 
Hallo,

also, eine Möglichkeit wäre, sich eine Klasse anzulegen, die Daten wie den Anzeigetext und der Referenz auf die andere Tabelle aufnimmt. Habe sie mal ComboBoxItem genannt.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public class ComboBoxItem
{
    public string Label { get; private set; }
    public Nullable<int> Reference { get; set; }

    public ComboBoxItem(string label, Nullable<int> reference)
    {
        this.Label = label;
        this.Reference = reference;
    }

    public override string ToString()
    {
        return this.Label;
    }
}
Wie Du siehst, ist die Eigenschaft für die Referenz Nullable. Die überschriebene ToString-Methode ist dafür da, das Label in der ComboBox anzuzeigen.

So, und dann kannst Du der ComboBox die Items hinzufügen:
ausblenden C#-Quelltext
1:
2:
3:
comboBox1.Items.Add(new ComboBoxItem("leer"null));
comboBox1.Items.Add(new ComboBoxItem("Reference1"0));
comboBox1.Items.Add(new ComboBoxItem("Reference2"1));


ps: Musste Deine Frage erst 3x durchlesen, bevor ich wusste, was Du willst, oder was das Problem ist. Vielleicht nächstes Mal ein bisschen verständlicher schreiben.

Gruss, Marko

Für diesen Beitrag haben gedankt: flyhigh83
flyhigh83 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 7
C# (VS2010)
BeitragVerfasst: Mo 08.11.10 16:46 
Hi Marko,

danke erstmal für die Antwort. Es hat mir zumindest mal etwas weitergeholfen.

Mein Problem ist es noch aktuell zu kapieren was ich für die "Reference" übergeben muss.

Ich habe ständig versucht Objekte mit dem Wert "null" zu übergeben?

Und so wi ich es probiert habe die erstelle Kombobox bereits zu leeren um neue Einträge hizuzufügen funktioniert. Aber ich bekomme dann den Wert nicht mehr an beine DatenSource bez. Valuemember gebunden.
Somit müsste ich die ganzen SQL und befehle Selber schreiben und ich kann meinen Tableadappter vergessen oder auch selbst schreiben

gibt es nicht die möglichkeit der bereits bestehenden und gefüllten Kombobox welche auch gleich die Richtige Daten für den Verweis anzeigt einen neuen Wert dazuzu adden.

comboBox.Items.Add(new ComboBoxItem("leer", null));

Nur geht das leider nicht wenn die DatenSource gebunden ist. :-(
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Di 09.11.10 08:21 
Moin,

also, nochmal zum Verständnis: Du hast eine Tabelle, nennen wir sie Elternteil. Und eine Tabelle Kind. Dann kann man sich das Ganze vielleicht besser vorstellen. Tabelle Kind hat eine Beziehung auf die Tabelle Elternteil.

Also kann ein Elternteil nur ein Kind haben, richtig? Oder halt keins, wenn der Fremdschlüssel null ist. Und ein Kind kann einen, mehrere oder kein Elternteil haben. Richtig?

Was ist aber, wenn ein Elternteil mehrere Kinder hat? Eigentlich wäre das Ganze ja eine typische m-zu-n - Relation. Also ist bei dem Design irgendwas komisch.

Ach ja, wusste nicht, dass Du dein DataSet nutzt. Hast Du aber auch nicht geschrieben.

Marko.
flyhigh83 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 7
C# (VS2010)
BeitragVerfasst: Di 09.11.10 12:27 
Hi,

ja vieleicht scheiß Beispiel da kommt man im Kopf durcheinander. Das Design ist ok.

Ich habe wirklich nur eine 1-n Beziehung

Meine eine Tabelle heißt "platz" die andere "anbieter"

Das macht es vielleicht logischer. Da ein Platz ja nicht mehrere Anbieter haben kann also in der Realität. Ok Personen die auf ein Grundstück eingetragen sind schon. Aber der Anbiter mit dem alles abgewickelt wird bleibt immer nur einer.
Aber ein Anbieter kann mir mehrere Plätze vermieten.
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Di 09.11.10 12:53 
Okay, dann ist das schon klarer.

Das bedeutet also, dass Du also eine ComboBox hast, wo die Anbieter alle angezeigt werden?

Also, eine Möglichkeit wäre, dass Du das SELECT-Statement des TableAdapters der Tabelle, die an der Combo gebunden wird, modifizierst. Also, normalerweise würde es ja so aussehen:
ausblenden SQL-Anweisung
1:
SELECT Id, Name FROM anbieter;					
Nun könntest Du sowas daraus machen:
ausblenden SQL-Anweisung
1:
2:
3:
SELECT Id, Name FROM anbieter
UNION
SELECT null'keiner';
Dann wäre der Wert also in der DataTable, die durch den Adapter gefüllt wird, ohne die Table ansich zu ändern.
Eine andere Möglichkeit wäre es, die Table zu ändern, und den Wert da rein zu schmeißen. Oder halt in der Datenbank bei Anbieter einen Eintrag für 'keiner' zu machen.

Soviel erstmal, Marko

Für diesen Beitrag haben gedankt: flyhigh83
flyhigh83 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 7
C# (VS2010)
BeitragVerfasst: Di 09.11.10 16:18 
Danke,

das hat mir jetzt extrems weitergeholfen. Habe für den Tabeladapter jetzt neue SQL Anweisungen in unter neue Methodennamen gepackt und kann somit sauber den Tabeladapter nutzen.