Autor Beitrag
creative100
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 04.04.15 12:48 
Ich möchte aus drei Tabellen

tbl_Person
tbl_Geschlecht
tbl_Pal

ein Eingabeformular MIT VISUAL STUDIO 2013 erstellen.

Im Projektmappen-Explorer habe ich eine Datenbank erstellt. Im Server Explorer habe ich die oben stehenden Tabellen erstellt. Ein DataSet wurde auch im Fenster Datenquellen angelegt. Die Haupttabelle ist Person.

Ich möchte nun ein Formular erstellen in dem ich eine Person eingeben kann (kein DataGridView sondern Details). Das Geschlecht wird über eine Combobox (in Tabelle tbl_Person) von der Tabelle tbl_Geschlecht gefüllt. Eine zweite Combobox (verbunden mit tbl_Pal) in der Tabelle tbl_Person soll nun auch gefüllt sein.

Sobald ich jedoch die zweite Combobox (tblPal) fülle verschwinden die Einträge in der ersten Combobox (tbl_Geschlecht).Auch in umgekehrter Vorgehensweise? Was ist falsch??? Ich verwende den "Assistenten" für die Verbindung zur entspr. Tabelle.

1. An Daten Gebundene Elemente verwenden
2. Datenquelle tbl_Geschlecht
3. Member anzeigen (Geschlecht)
4. Wertmember (gesch_Id)
5. Ausgewählter Wert (kann frei bleiben oder)

Mit der zweiten Combobox mach ich es genau so doch aus einer der beiden verschwinden dann die Einträge. Bin Anfänger von daher möchte ich die Möglichkeiten von Visual Studio verwenden und nicht selbst den Code für die Comboboxen in das Formular schreiben.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 04.04.15 13:02 
Mit einer freien Beschreibung deines Problems kommen wir nur sehr unwahrscheinlich hinter das Problem. Wenn du willst isoliere nur die relevanten Teile und hänge das so reduzierte Projekt hier als Attachment an.

Zitat:
Bin Anfänger von daher möchte ich die Möglichkeiten von Visual Studio verwenden und nicht selbst den Code für die Comboboxen in das Formular schreiben.


Da würde ich dir den Zahn ziehen wollen das das ein sinnvoller Ansatz ist. So wie Databinding funktioniert ist es nur hilfreich wenn man die Details einigermaßen kennt wie es funktioniert. Also wenn man auch ungefähr weiß was man manuell tun müsste ohne die Hilfe des Designers. Sonst wirst du regelmäßig vor eine Wand stoßen an der du nicht weiterkommst. Databinding ist eine Beschleunigung beim Design ersetzt aber kein Detailwissen.
creative100 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 04.04.15 13:20 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:


Da würde ich dir den Zahn ziehen wollen das das ein sinnvoller Ansatz ist. So wie Databinding funktioniert ist es nur hilfreich wenn man die Details einigermaßen kennt wie es funktioniert. Also wenn man auch ungefähr weiß was man manuell tun müsste ohne die Hilfe des Designers. Sonst wirst du regelmäßig vor eine Wand stoßen an der du nicht weiterkommst. Databinding ist eine Beschleunigung beim Design ersetzt aber kein Detailwissen.


Insofern hast du recht, doch möchte ich Visual Studio näher kennen lernen und eben auch die Möglichkeiten die Visual Studio beinhaltet. Hierzu zählt eben auch das füllen von Comboboxen. Später werden die Funktionen von Visual Studio nicht mehr ausreichen und ich muss eigenen Code schreiben.

Im Anhang ist das gesamte Projekt. Es kann alles verändert werden, später wenn das Problem behoben werden kann wird es erst erweitert.

Vielen dank!!!
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 04.04.15 13:54 
Primäres Problem scheint erstmal zu sein das du an den ComboBoxen FormattingEnabled auf true gesetzt.

Der Zusammenhang warum das Problem dann auftritt ist mir jetzt selbst nicht ganz klar. Die Folge ist aber das die Auswahl für ungültig gehalten wird und weiteres Editieren gesperrt ist bis das Problem in der zuletzt editierten ComboBox behoben ist. Heißt du kannst kein anderes Feld bearbeiten nur diese ComboBox. Ein nicht editierbare ComboBox zeigt dann halt ihren DropDown nicht mehr an. Du kannst aber auch keine andere TextBox verwenden. Da du fixen Text anzeigst ist FormattingEnabled auch nicht hilfreich kann also auf false bleiben.

Andere Dinge die mir auf die schnelle nebenbei aufgefallen sind.

- Die tbl_Geschlecht_tbl_Person Relation in deinem Dataset stellt gesch_Id und pers_ID in Beziehung. Es sollte wohl Geschlecht sein und nicht pers_Id.
- du benutzt char Typen für Text in deiner DB. Char Typen benutzen immer ihre ganze Länge. Heißt z.B. deine Aktivitäten Texte sind immer 100 Zeichen lang auch wenn du was kürzeres eingegeben hast werden trotzdem 100 Zeichen benutzt und mit Leerzeichen aufgefüllt. Char benutzt man nur wenn man tatsächlich nur Texte hat die alle gleich Lang sind. Du solltest eher varchar bzw. nvarchar benutzen dann gehen auch einige unschöne Effekte in der UI weg die damit zusammenhängen das überall so viele Leerzeichen unterwegs sind.
- Die ComboBoxen solltest du auf DropDownStyle = DropDownList setzen. Du kannst dort eh keinen beliebigen Freitext eintragen.
- Überdenke nochmal das Naming in der DB. Ein Einheitliches Konzeot ist extrem hilfreich auch für einen selbst (der Fehler wie zum Beispiel bei der oben genannten Relation würde dir viel eher auffallen). Zum Beispiel solltest du die verknüpften Felder in den beteiligten Tabellen gleich benennen. Am besten (meine Meinung) TabellenNameId. Groß/Klein Schreibung wechseln verwirrt auch nur. Und eine Tabelle Tabelle zu nennen ist zumindest überflüssig. Welche Info enthält tbl_ wenn alles tbl ist?
creative100 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 04.04.15 14:40 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Primäres Problem scheint erstmal zu sein das du an den ComboBoxen FormattingEnabled auf true gesetzt.


Nein die sind Standard eingestellt und war für mich bisher nicht relevant. habe ich geändert.

Zitat:
Der Zusammenhang warum das Problem dann auftritt ist mir jetzt selbst nicht ganz klar. Die Folge ist aber das die Auswahl für ungültig gehalten wird und weiteres Editieren gesperrt ist bis das Problem in der zuletzt editierten ComboBox behoben ist. Heißt du kannst kein anderes Feld bearbeiten nur diese ComboBox. Ein nicht editierbare ComboBox zeigt dann halt ihren DropDown nicht mehr an. Du kannst aber auch keine andere TextBox verwenden. Da du fixen Text anzeigst ist FormattingEnabled auch nicht hilfreich kann also auf false bleiben..


Schade, die Combobox bleibt also doch leer. Was in Access lächerlich einfach ist, ist für Visual Studio offenbar ein gravierendes Problem. Ich würde gerne die Ursache oder den Fehler herausfinden


Zitat:
Andere Dinge die mir auf die schnelle nebenbei aufgefallen sind.

- Die tbl_Geschlecht_tbl_Person Relation in deinem Dataset stellt gesch_Id und pers_ID in Beziehung. Es sollte wohl Geschlecht sein und nicht pers_Id.
- du benutzt char Typen für Text in deiner DB. Char Typen benutzen immer ihre ganze Länge. Heißt z.B. deine Aktivitäten Texte sind immer 100 Zeichen lang auch wenn du was kürzeres eingegeben hast werden trotzdem 100 Zeichen benutzt und mit Leerzeichen aufgefüllt. Char benutzt man nur wenn man tatsächlich nur Texte hat die alle gleich Lang sind. Du solltest eher varchar bzw. nvarchar benutzen dann gehen auch einige unschöne Effekte in der UI weg die damit zusammenhängen das überall so viele Leerzeichen unterwegs sind.
- Die ComboBoxen solltest du auf DropDownStyle = DropDownList setzen. Du kannst dort eh keinen beliebigen Freitext eintragen.
- Überdenke nochmal das Naming in der DB. Ein Einheitliches Konzeot ist extrem hilfreich auch für einen selbst (der Fehler wie zum Beispiel bei der oben genannten Relation würde dir viel eher auffallen). Zum Beispiel solltest du die verknüpften Felder in den beteiligten Tabellen gleich benennen. Am besten (meine Meinung) TabellenNameId. Groß/Klein Schreibung wechseln verwirrt auch nur. Und eine Tabelle Tabelle zu nennen ist zumindest überflüssig. Welche Info enthält tbl_ wenn alles tbl ist?


... sind Schönheitsfehler. Bei den Datentypen habe ich vermutet, dass CHAR immer 100 Zeichen sind, jedoch nicht weiter beachtet(es ging mir mehr um die Comboboxen). Beim eintragen in die Tabelle, wurden immer Leerzeichen angehängt. Habe jetzt nvchar()eingetragen.

Danke für deine konstruktiven Ausführungen. Schade dass die Comboboxen immer noch nicht gefüllt sind. Habe das Projekt nochmal hochgeladen in der Hoffnung, das jemand den Fehler findet.
Einloggen, um Attachments anzusehen!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 04.04.15 15:08 
Die Aktivität ComboBox benutzt pal als ValueMember. Sollte wohl eher pal_id sein. Und bei beiden hast du den Text gebunden aber du willst nicht den Text in die tbl_Person Tabelle schreiben sondern den Value. Also anstatt bei den beiden ComboBoxen an Text zu binden sollte es eher SelectedValue sein.
creative100 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 04.04.15 16:06 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Die Aktivität ComboBox benutzt pal als ValueMember. Sollte wohl eher pal_id sein.


Du schaust vermutlich in den CODE auf diese Zeile:

ausblenden Quelltext
1:
this.aktivitätComboBox.ValueMember = "pal_Id";					



Zitat:
Und bei beiden hast du den Text gebunden aber du willst nicht den Text in die tbl_Person Tabelle schreiben sondern den Value.


Verstehe ich nicht wirklich? Vermutlich meinst Du:

ausblenden Quelltext
1:
this.aktivitätComboBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.tbl_PersonBindingSource, "Aktivität", true));					




Zitat:
Also anstatt bei den beiden ComboBoxen an Text zu binden sollte es eher SelectedValue sein.


Ein SelectedValue finde ich nur in der 4. Zeile.? Der Code der ersten Combo (als Bsp):

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 // geschlechtComboBox
 
this.geschlechtComboBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.tbl_PersonBindingSource, "Geschlecht", true));
this.geschlechtComboBox.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.tbl_PersonBindingSource, "Geschlecht", true));
this.geschlechtComboBox.DataSource = this.tblGeschlechtBindingSource;
this.geschlechtComboBox.DisplayMember = "Geschlecht";
this.geschlechtComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.geschlechtComboBox.Location = new System.Drawing.Point(78, 116);
this.geschlechtComboBox.Name = "geschlechtComboBox";
this.geschlechtComboBox.Size = new System.Drawing.Size(200, 21);
this.geschlechtComboBox.TabIndex = 8;
this.geschlechtComboBox.TabStop = false;
this.geschlechtComboBox.ValueMember = "gesch_Id";


Ich verwende Combobox Aufgaben dort finde ich nur Ausgewählter Wert und das sollte

ausblenden Quelltext
1:
tbl_PersonBindingSource, "Geschlecht"					


sein.??? Ich hoffe ich liege richtig. Du siehst, ich versuche zu verstehen, es geht nur nicht so wie es gerne erwünscht wäre.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 04.04.15 16:24 
Zitat:
Du schaust vermutlich in den CODE auf diese Zeile:

this.aktivitätComboBox.ValueMember = "pal_Id";

Nein du wolltest das ja über den Designer machen ;) Wenn du im Designer dir die Properties der aktivitätComboBox ansiehst dann findest du dort auch die Property ValueMember und die steht auf pal sollte aber wohl pal_Id sein. Die Codezeile die du gefunden hast entspricht genau dem Designer und die könntest du auch von Hand ändern kommt gleiche raus. Es ist eine gute Idee mal ab und zu in die Designer.cs reinzuschauen das erhöht denke ich das Verständnis zu sehen welche Designer Änderung welcher Änderung in dieser Codedatei entspricht für den Anfang solltest du aber den automatisch generierten Code nicht von Hand ändern. Wenn du da was falsch machst dann streikt bei einem Fehler der Designer und wen du in diesem Fall dann denn Designer öffnest ist die Wahrscheinlichkeit hoch das der dann aufgrund von Fehlinterpretationen noch mehr kaputt macht und das dann zu reparieren muß man wirklich verstehen wie der funktioniert. Da sollte mann erst ein gewisses Grundverständnis haben wenn man denn Designercode ändert. Wenn man Dinge selbst macht dann auch im eigenen Code wo der Designer nicht dran rumspielt.

Zitat:
Verstehe ich nicht wirklich? Vermutlich meinst Du:

this.aktivitätComboBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.tbl_PersonBindingSource, "Aktivität", true));

Der erste Parameter beim Binding benennt die Property hier "Text" sollte aber "SelectedValue" sein. Die Codestelle wäre also schon die richtige. Das geht aber auch über den Designer. In der anderen ComboBox entsprechend genauso.

DataBinding

Zitat:
this.geschlechtComboBox.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.tbl_PersonBindingSource, "Geschlecht", true));
this.geschlechtComboBox.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.tbl_PersonBindingSource, "Geschlecht", true));


2 Properties der ComboBox an Geschlecht zu binden bringt das System bestimmt so richtig durcheinander ;) Nur SelecteValue solltest du binden.
Einloggen, um Attachments anzusehen!
creative100 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 04.04.15 17:34 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
Du schaust vermutlich in den CODE auf diese Zeile:

this.aktivitätComboBox.ValueMember = "pal_Id";

Nein du wolltest das ja über den Designer machen ;) Wenn du im Designer dir die Properties der aktivitätComboBox ansiehst dann findest du dort auch die Property ValueMember und die steht auf pal sollte aber wohl pal_Id sein. Die Codezeile die du gefunden hast entspricht genau dem Designer und die könntest du auch von Hand ändern kommt gleiche raus. Es ist eine gute Idee mal ab und zu in die Designer.cs reinzuschauen das erhöht denke ich das Verständnis zu sehen welche Designer Änderung welcher Änderung in dieser Codedatei entspricht für den Anfang solltest du aber den automatisch generierten Code nicht von Hand ändern. Wenn du da was falsch machst dann streikt bei einem Fehler der Designer und wen du in diesem Fall dann denn Designer öffnest ist die Wahrscheinlichkeit hoch das der dann aufgrund von Fehlinterpretationen noch mehr kaputt macht und das dann zu reparieren muß man wirklich verstehen wie der funktioniert. Da sollte mann erst ein gewisses Grundverständnis haben wenn man denn Designercode ändert. Wenn man Dinge selbst macht dann auch im eigenen Code wo der Designer nicht dran rumspielt.



Zunächst erst einmal danke für deine super Erklärung, auch wenn das Problem noch nicht gelöst ist, habe ich mehr Verständnis über diese Vorgänge erhalten und bereichert mich. Ich arbeite sehr gern mit Access und will ein Projekt in C# Rumbasteln. In Access kann ich in einer Combobox zwei Spalten anzeigen. Ist das in Visual Studio auch irgendwie möglich?? Gerade in der Tabelle tbl_Pal sind die Werte 1,4 bis 2 sehr wichtig auch als visuelle Darstellung in der Combobox. Also der Pal wert und die Info dazu in der Combobox wären eine super Sache, aber....
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 04.04.15 18:11 
Die Windows ComboBox gibt das von Haus aus nicht her. Optionen
- selbst eine ComboBox programmieren.
- eine bereits programmierte ComboBox im Netz suchen die das kann
- die jetzige ComboBox benutzen und der Datenquelle eine Spalte/Property die alle Informationen die man in der Combox sehen will als eine Spalte veröffentlichen (Stichwort berechnete Spalte)

Zitat:
Ich arbeite sehr gern mit Access und will ein Projekt in C# Rumbasteln


Nur um Enttäuschungen vorzubeugen. Arbeiten wie mit Access kann man am besten mit Access ;) Oder nochmal anders gesagt. Schrauben drehen kann man am besten mit einem Schraubendreher. Das geht auch mit einem Multiwerkzeug das auch noch viele andere Sachen kann aber wenn man nur Schrauben drehen will ist man beim Schraubendreher besser aufgehoben der dafür spezialisiert ist.
creative100 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 04.04.15 19:53 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Nur um Enttäuschungen vorzubeugen. Arbeiten wie mit Access kann man am besten mit Access ;) Oder nochmal anders gesagt. Schrauben drehen kann man am besten mit einem Schraubendreher. Das geht auch mit einem Multiwerkzeug das auch noch viele andere Sachen kann aber wenn man nur Schrauben drehen will ist man beim Schraubendreher besser aufgehoben der dafür spezialisiert ist.



Ich verstehe dich, dennoch stoße ich bei Visual Studio sehr schnell an seine Grenzen und frage mich immer mehr, was an dieser Software so besonders ist. Zudem ist es auch sehr teuer. Menüs basteln, Forms einfügen, IntelliSense und Refactoring sind die Highlights. (sehr oberflächlich) Eclipse kann Refactoring auch wesentlich besser. Doch das nur nebenbei, schlecht ist Visual Studio deshalb nicht, ich bin nur enttäuscht.

Vielen Dank für deine Anregungen.