Autor Beitrag
Dr_Shiwago
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 11.02.10 10:18 
Guten Morgen allerseit. Zu erst möchte ich mich über die Unterstützung in meinem ersten Beitrag bedanken.

Nun zu meiner nächsten Problemstellung. Ich habe ein Access Datenbank, deren Daten ich über eine GridView ausgebe. Habe auch bereits das speichern drin, falls ich im gridview was ändere. Ich möchte jetzt ne chekcbox in mein GridView hinzufügen,bzw. habe ich schon gemacht. Nun möchte ich das wenn ich die Checkbox oder mehrere Checkboxen anwähle dementsprechen die Zeile Lösche. Ich krieg das aber irgendwie nicht hin. Ich hoffe ihr könnt mir dabei weiter helfen.

Hier mein bisheriger Code und im Anhang das zu meinem Programm gehörige Bild:

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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Reflection;


namespace daten_neu
{
    
    public partial class Form1 : Form
    {
        private OleDbDataAdapter da = null;
        private DataSet ds = null;
        private OleDbConnection conn = new OleDbConnection(
                             "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:/Users/Franz9/Desktop/Miele Projekt/Übungsprogramme/versuch.mdb;");
       
        public Form1()
        {
            InitializeComponent();
            connect();
            CreateCheckBoxColumn();
        }

        private void connect()
        {
            
            OleDbCommand cmd = new OleDbCommand("SELECT * FROM Produkte", conn);
            da = new OleDbDataAdapter(cmd);
            ds = new DataSet();
            da.Fill(ds, "Produkte");
            dataGridView1.Columns.Clear();
            dataGridView1.DataSource = ds;
            dataGridView1.DataMember = "Produkte";
           

        }

        private void CreateCheckBoxColumn()
        {
            
            DataGridViewCheckBoxColumn CheckBoxColumn =
                new DataGridViewCheckBoxColumn();
            CheckBoxColumn.Name = "Löschen";
            CheckBoxColumn.HeaderText = "Löschen";
          
            dataGridView1.Columns.Insert(1, CheckBoxColumn);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            connect();
            CreateCheckBoxColumn();
        }
        
        public void setTabelle1(ref DataSet ds)
        {
            OleDbCommandBuilder cb = new OleDbCommandBuilder(da);   // das reicht!

            conn.Open();
            da.Update(ds, "Produkte");
            conn.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            DataSet ds1 = ds.GetChanges();
            if (ds1 != null)
            {
                // Änderungen in Datenbank schreiben:
                try
                {
                    setTabelle1(ref ds1);
                    //ds.Merge(ds1);
                    ds.AcceptChanges();
                    MessageBox.Show("Datenbank wurde aktualisiert!""Erfolg");
                }
                catch (Exception ex)
                {
                    ds.RejectChanges();
                    MessageBox.Show(ex.Message, "Fehler");
                }

            }
        }


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Do 11.02.2010 um 09:26
Einloggen, um Attachments anzusehen!
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 11.02.10 10:26 
Immer diese absichtliche Verwirrung: GridView (laut Titel) oder DataGridView (laut "Code")? Soll das Code sein ohne Markierung? Wozu gibt es "Bereiche" mit der Auswahl C# in der ComboBox?

Warum muss es den Helfern so schwer gemacht werden? Danke, Christian!

//Nachtrag
Ich kann nicht erkennen, dass der CheckBox-Click irgendetwas auslöst. Beispielsweise könnte die Checked-Änderung den betreffenden Datensatz auf Delete bzw. Not-Delete setzen. Der Update-Befehl wertet schließlich DataRowState aus.

Übrigens kannst du auf conn.Open/Close verzichten; das steuert Update selbst - ebenso wie AcceptChanges.

Gruß Jürgen
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 11.02.10 10:42 
Der CheckBox click löst ja auch noch nichts aus, weil ich nicht weiß wie. Ich bin noch ziemlich neu auf dem Gebiet. Und weiß jetzt nicht genau wie ich das Problem hier lösen soll. Ich bräuchte jetzt nur nen tipp wie ich das mache das ich über den löschen button die zeile lösche in dem die CheckBox markiert/aktiviert ist.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 11.02.10 11:25 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Immer diese absichtliche Verwirrung:

Oh ja, ich bin mir sicher, Dr_Schiwago hat sich bei seinem Posting genau überlegt: "Wie schreib ich das jetzt so, dass der JüTho verwirrt ist?" :roll:

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
GridView (laut Titel) oder DataGridView (laut "Code")? Soll das Code sein ohne Markierung? Wozu gibt es "Bereiche" mit der Auswahl C# in der ComboBox?

Warum muss es den Helfern so schwer gemacht werden? Danke, Christian!

Nimm's mir nicht übel, wenn ich das jetzt so schreibe, aber: Entspann Dich mal!

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dr_Shiwago Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 11.02.10 11:36 
Ja das war auch nicht der Sinn meines Posting, jemanden zu verwirren. Ich bräuchte nur jemanden der mir auf die Sprünge hilft.
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 11.02.10 13:13 
Und mein Ziel war es, darauf hinzuweisen, dass die Frage künftig von vornherein sauber gestellt wird.

Unter Windows reagiert man immer auf Ereignisse. Beim DataGridView ist das Problem, den richtigen Bestandteil mit einem passenden Ereignis zu finden. Auch wenn du 7 Spalten mit CheckBoxen füllst und 389 Zeilen hast, gibt es genau eine CheckBox für das ganze DataGridView, die in der jeweils aktiven DataGridViewCheckBoxCell eingeblendet wird.

Diese könntest du auswerten, indem du zunächst das Ereignis EditingControlShowing benutzt, diese CheckBox als Variable zwischenspeicherst und nach dem Verlassen der Zelle ihren Wert abfragst.

Oder du benutzt direkt den Click auf die Zelle:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void myDataGridView_CellClick( object sender, DataGridViewCellEventArgs e )
{
   int i1 = e.RowIndex;
   int i2 = e.ColumnIndex;
   if (myDataGridView.Rows[i1].Cells[i2] is DataGridViewCheckBoxCell) {
      if( (bool)(myDataGridView.Rows[i1].Cells[i2] as DataGridViewCheckBoxCell).Value )
         myTable.Rows[i2].Delete();
   }
}

Das ist noch verkürzt formuliert; z.B. muss auch geregelt werden, dass ein Datensatz auf "Löschen" gesetzt worden war und dieser Check zurückgenommen wird. Aber so ähnlich könnte es gehen, aber:

So etwas Dummes, in der SDK-Doku/MSDN/Hilfe steht folgender Hinweis:
Zitat:
Beim Klicken in einer DataGridViewCheckBoxCell tritt dieses Ereignis auf, bevor sich der Wert des Kontrollkästchens ändert. Wenn Sie nicht den erwarteten Wert auf Grundlage des aktuellen Werts berechnen möchten, behandeln Sie stattdessen das DataGridView.CellValueChanged-Ereignis.

Also muss DataGridView.CellValueChanged oder auch DataGridView.CellValueNeeded verwendet werden. Dazu hat die SDK-Doku ein wohl passendes Beispiel.

Gruß Jürgen

PS. Ich stimme zu, wenn das DGV als seltsam kompliziertes Control bezeichnet wird. Das Problem besteht darin, dass es vorwiegend zur Anzeige (und Änderung) von Daten gedacht war und jeweils die Werte der Daten (z.B. DataTable) abgefragt werden sollten. Den Entwicklern ist während der Arbeit aber soviel zur Arbeitserleichterung für die Anwender eingefallen, dass sie sich verrannt haben und es dadurch intern um so komplizierter wurde.