Autor Beitrag
joshua9
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Do 04.03.10 11:55 
:?:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Do 04.03.10 16:01 
Zuerst vielen Dank für den Hinweis

1. Auswahl des zu editierenden Datensatzes anhand DataGridView
ausblenden 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.
ausblenden 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


Zuletzt bearbeitet von joshua9 am Fr 05.03.10 09:08, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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 :
ausblenden 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
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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