Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Combox


joshua9 - Do 04.03.10 11:55
Titel: Combox
:?:
Hallo ich brauche Hilfe für folgendes Problem:
ich wähle aus eimem Grid die Reihe aus, welche ich editieren möchte.
mit DATAROWVIEW kann ich die Werte zuweisen.
Jetzt habe ich eine Combox Feld, wo ich mit einer Datebank verbunden habe
Das Problem ich möchte aus der Mastertabelle den Wert zuweisen im Feld Combox
BSP Mastertabelle Feldwert ist 2 in combox soll das Feld mit dem Wert 2 dargestellt werden
(Z.B) Schrank
cBAufbewahrungsort.SelectedValue = drv["IdOrt"];

es zeigt aber immer den ersten Eintrag von Combox an ?
Vielen Dank für die Hilfe
joshua


JüTho - Do 04.03.10 13:01

Hallo und :welcome:

Ich empfehle dringend, die verwendeten Klassen und die Probleme genau zu bezeichnen. Es gibt mehrere Arten von Grids; welches nutzt du? Das Ding heißt nicht Combox, sondern ComboBox; die richtige Schreibweise hilft bei der Suche ungemein. Ein Feld kann niemals mit einer Datenbank verbunden sein, allenfalls mit einer DataTable, die ihre Daten von einer Datenbank bekommen hat.

Zur ComboBox mit Datenbindung: Es wird zwischen DisplayMember und ValueMember unterschieden.

Gruß Jürgen


joshua9 - Do 04.03.10 16:01

Zuerst vielen Dank für den Hinweis

1. Auswahl des zu editierenden Datensatzes anhand DataGridView

C#-Quelltext
1:
2:
3:
4:
            datenSpalteView = datenView[dGvUebersicht.CurrentRow.Index]; 
            frmEdit Edit = new frmEdit();
            Edit.editKunden(datenSpalteView);
            Edit.Dispose();

2. öffen eines neuen Fensters
3. im neuen Fenster sind die einzelen ComBox Elemente welche vorgängig mit einer Datenbanktabelle verknüpft wurde Tabelle Aufbewahrungsort mit den Elementen 1. Schrank, 2. Katen, 3. etc.

C#-Quelltext
1:
2:
3:
4:
5:
6:
           public void editKunden(DataRowView drv) 
             {
                    .........
                    cBAufbewahrungsort.SelectedValue = drv["IdOrt"];
                    .........
             }

4. mein Wunsche die ComBox soll nun den Wert anzeigen welchen ich aus der DataGridView gewählt habe -> Vorgehen: cBAufbewahrungsort.SelectedValue = drv["IdOrt"];

Vielen Dank für die Hilfe
Joshua

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


JüTho - Do 04.03.10 16:50

Die Frage nach den eigentlichen Daten hast du noch nicht beantwortet. Das DataGridView dient (wie der Name schon sagt und wie du es eigentlich auch beachtest) dazu, Daten in einem Grid zur Anzeige zu bringen. Wenn die Daten selbst bearbeitet werden sollen, sind die Daten zu benutzen; der Zusammenhang mit dem DGV darf keine Rolle spielen - vor allem darfst du die angezeigte Zeile nicht an ein anderes Formular übergeben.

Einer der möglichen Wege geht so:

C#-Quelltext
1:
2:
3:
4:
5:
DataRow row = dGvUebersicht.CurrentRow.DataBoundItem as DataRow;
// Übergabe an das andere Formular
Edit.editKunden(row);
// Abfrage durch den Spaltennamen
cBAufbewahrungsort.SelectedValue = row["IdOrt"];

Dabei habe ich vorausgesetzt, dass es sich um eine DataTable handelt; dann sind die einzelnen Zeilen wirklich vom Typ DataRow. Es gibt noch andere Wege; aber keinesfalls solltest du Daten per Code direkt in die Zellen des DGV schreiben (das führt früher oder später immer zu Problemen; das "keinesfalls solltest du" ist fast zu lesen wie "keinesfalls darfst du").

Gruß Jürgen


joshua9 - Fr 05.03.10 09:06

Hallo und vielen Dank für die Antwort
Die Daten sind in einer Mysql Datenbank
hier habe ich z.B eine Tabelle A wo die einzelen Daten sind wie ID_Ort
in einer Tabelle B sind dann:
IDOrt =1,2,3,..,n
Ort =Gestell,Schrank1,Schrank2, etc.

Ich möchte die Werte aus Tabelle A editieren. Jetzt wähle ich die Daten aus wie oben beschrieben
und öffnen eine neues Formular. Ich möchte nun, dass im Feld ComBox der Wert angezeigt wir, welchen ich aus gewählt haben z.B IdOrt = 2 -> ComBox soll Schrank1 anzeigen.
Mit dem Code

C#-Quelltext
1:
cBAufbewahrungsort.SelectedValue = drv["IdOrt"];                    

funktionier es nicht, obwohl drv[IdOrt] den Wert 2 hat.

Vielen Dank für die Hilfe
Gruss Joshua


JüTho - Fr 05.03.10 10:06

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Die Frage nach den eigentlichen Daten hast du noch nicht beantwortet. ... Dabei habe ich vorausgesetzt, dass es sich um eine DataTable handelt; ...

Weder ComboBox noch DataGridView haben Kontakt zur Datenbank (das ist technisch völlig ausgeschlossen und 100%ig unmöglich). Wenn du nicht darauf eingehst, wie bzw. wo die Daten im Arbeitsspeicher eingetragen sind und wie die Verbindung zu DGV bzw. ComboBox bisher geregelt ist, ist es für mich sinnlos, weiter nachzudenken. Jürgen


joshua9 - Fr 05.03.10 11:04

vielen Dank, dass Du dir die Mühe nimmst

beim ComBox Feld weise ich graphisch
DataSource = aufbewahrungsortBindingSource
DisplayMember = Aufbewahrungsort
ValueMember = IdOrt

die Daten aus DataGridView kommen über folgende Befehle

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        datenAdapter = new MySqlDataAdapter(BefehleSql.Uebersicht()+SqlBefehl_V, myconn);
            datenTabelle = new DataTable("BandUbersicht");
            myconn.Open();
            datenAdapter.Fill(datenTabelle);
            myconn.Close();
            datenView = new DataView(datenTabelle);
            bs.DataSource = datenView;
            dGvUebersicht.DataSource = bs;
            bindingNavigatorUe.BindingSource = bs;

es ist mir schon klar, dass ich die Tabelle BandUbesicht nicht editieren kann
es geht mir nur um die Frage, warum im Feld ComBox nicht der Wert dargestellt wird, welchem ich mit SelectValue zuweise
Gruss Joshua


joshua9 - Sa 06.03.10 22:58

Hallo kann mir jemand sagen,
warum das Feld nicht aktualisiert wird ?
Die Zuweisungen stimmen aber die Felder werden nur aktualisiert, wenn ich das ganze über einen
Button löse, dann werden die Felder aktualisiert
Aufruf über :

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
        private void btnEditieren_Click(object sender, EventArgs e)
        {
            datenSpalteView = datenView[dGvUebersicht.CurrentRow.Index]; 
            frmEdit Edit = new frmEdit();
            Edit.editKunden(datenSpalteView);
            Edit.Dispose();
        }


Formular Edit

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
        public void editKunden(DataRowView drv)          // der Übergabeparameter ist die aktuelle Zeile !
        {
            if (drv.Row.RowState == DataRowState.Detached)  // Wenn eine neuer Datensatz hinzugefügt wird
            {
                tBBandNummer.Text = Bandnummer;
                cBoxAufbewahrungsort.Text = "Eingabe";
                cBBandart.Text = "Eingabe";
                cBBandmarke.Text = "Eingabe";
                cBServer.Text = "Eingabe";
            }
            else
            {
                Zuweisen();
            // Zuweisen der Abfragedaten an die Felder, damit nachher eine Update erfolgen kann
                tBBandNummer.Text = drv["Nummer"].ToString();
                cBoxAufbewahrungsort.SelectedValue =drv["IdOrt"];
                cBBandmarke.SelectedValue = drv["IdMarke"];
                dTPickerDatum.Value = Convert.ToDateTime(drv["Datum"]);
                cBServer.SelectedValue = drv["ServerId"];
                label3.Text = drv["ServerId"].ToString();
                cBBandart.SelectedValue = drv["BandArtId"];
                tBBeschreibung.Text = drv["Beschreibung"].ToString();
            }
            if (this.ShowDialog() == DialogResult.OK)
            {
                // speichern
                drv.BeginEdit();
                drv["Nummer"] = Convert.ToInt32(tBBandNummer.Text);
                drv["IdOrt"] = Convert.ToInt32(cBoxAufbewahrungsort.SelectedValue);
                drv["IdMarke"] = Convert.ToInt32(cBBandmarke.SelectedValue);
                drv["Datum"] = dTPickerDatum.Value;
                drv["ServerId"] = Convert.ToInt32(cBServer.SelectedValue);
                drv["BandArtId"] = Convert.ToInt32(cBBandart.SelectedValue);
                drv["Beschreibung"] = Convert.ToString(tBBeschreibung.Text);
                drv.EndEdit();
            }
            else
                drv.CancelEdit();

        }


JüTho - So 07.03.10 12:29

Mir kommt das Ganze komisch vor, und dein missratener Code stört mich sehr beim Nachdenken.

Neben den schon genannten Punkten kommt das dadurch, dass du dauernd Convert.To verwendest, wo das ein Umweg ist und ein einfaches (int) auch genügen würde; erst recht Quatsch ist ein ToString für einen Text - weg damit!

Aber ausnahmsweise will ich mal nicht so sein, weil mich die Ursache auch interessiert. Wenn du willst, kannst du das ganze Projekt in eine zip-Datei packen und mir per PN zuschicken.

Jürgen