Laden...

DataGridview: Checkbox Value kann durch User nicht geändert werden

Erstellt von PalPal vor 13 Jahren Letzter Beitrag vor 13 Jahren 7.962 Views
PalPal Themenstarter:in
24 Beiträge seit 2011
vor 13 Jahren
DataGridview: Checkbox Value kann durch User nicht geändert werden

Hallo zusammen,

Ich habe auf meiner Form ein DataGridview, welcher dynamisch durch diverse Abfragen auf meine Datenbank befüllt wird.

Die erste Spalte ist eine DataGridViewCheckboxColumn, welche default unchecked ist.

Der User soll mithilfe der Checkboxen 1-n Datensätze auswählen können, welche anschließend weiter verarbeitet werden sollen.

Nun erschließt sich mir folgendes Problem: die Checkboxen ändern ihren Wert beim anklicken nicht 😃

Also habe ich mir nochmals alle Eigenschaften der Spalte angeschaut.. habe die False-/True Werte auf "false"/"true" 0 / 1 gesetzt, readonly auf false , threemode auf false.... allerdings ohne Ergebnis.

ich vermute ich benötige also einen eventhandler der - ganz simpel - den Wert von check auf uncheck (und umgekehrt) setzt? Oder aber ich habe irgendetwas übersehen...

Da ich allerdings das erste mal mit DataGridViews arbeite, nun schon gefühlte 30 threads in diversen Foren gelesen habe und immernoch nicht weiterkomme bitte ich hier um eine kurze Hilfe 😦

F
10.010 Beiträge seit 2004
vor 13 Jahren

Sobald du ein DGV bindest, muss jede spalte gebunden werden.
Welche spalte im DGV hast du denn an die ComboBoxColumn gebunden?

PalPal Themenstarter:in
24 Beiträge seit 2011
vor 13 Jahren

zur Zeit ist an die checkboxspalte keine andere Spalte gebunden, da ja vom User entschieden werden soll, welche checkboxen gecheckt werden sollen und welche nicht..

gibt es eine Möglichkeit die Sache dennoch zum laufen zu bekommen / wo könnte ich eine Spalte anbinden?

F
10.010 Beiträge seit 2004
vor 13 Jahren

Du hast doch sicherlich eine DataTable ( oder hast du die daten ins dgv gefrickelt)?

Dann erstellst du einfach nach dem laden eine neue Spalte in der DataTable vom Typ bool und bindest diese an die Spalte.

PalPal Themenstarter:in
24 Beiträge seit 2011
vor 13 Jahren

Als DataSource für mein Datagridview dient (für die Spalten 1-n) ein DataTable, welcher Spalte 1-n befüllt ; Spalte 0 (checkbox) hat ursprünglich keine DataSource, da ich davon ausging, dass es durch die Unabhängigkeit vom Kontext keine benötigt.

im Coding sieht es wie folgt aus (bezeichnungen umbenannt..)


private DataTable uebergabe_DT()
        {
            DataTable uebergabe = new DataTable("uebergabe");

            DataColumn column1 = new DataColumn();
            column1.DataType = System.Type.GetType("System.String");
            column1.ColumnName = "Name";
            uebergabe.Columns.Add(column1);

            DataColumn column2 = new DataColumn();
            column2.DataType = System.Type.GetType("System.String");
            column2.ColumnName = "Vorname";
            uebergabe.Columns.Add(column2);
            return uebergabe;
        }

        private void anzeigen(int ID)
        {
                   /*  hier stehen diverse Zeilen mit SQL-Befehlen */

                 DataTable uebergabe = uebergabe_DT();

                 for (int i=0; i<Liste.count; i++) 
                 // Liste  enthält einen teil der SQL-Ergenisse
                 {
                        DataRow row = uebergabe.NewRow();
                        row["Vorname"] = Vorname;
                        row["Nachname"] = Nachname;
                        uebergabe.Rows.Add(row["Vorname"], row["Nachname"])
                  }
                DataGrid DG1 = new DataGrid(); 
                DataGridViewCheckBoxColumn cbcolumn = new  DataGridViewCheckBoxColumn();
            
            cbcolumn.HeaderText = "check";
            cbcolumn.Name = "check_name";
            DataGridView1.Columns.Add(cbcolumn);
            DataGridView1.DataSource = uebergabe;
}

Nun habe ich in der Methode übergabe_DT eine weitere column "boolean" angefügt:


            DataColumn column3 = new DataColumn();
            column3.DataType = System.Type.GetType("System.Boolean");
            column3.ColumnName = "bool";
            uebergabe.Columns.Add(column3);

Diese wird auch im Datagridview als Checkboxcolumn angezeigt (juhuu) .. allerdings selbes Problem, dass man diese Checkbox nicht checken kann.

PalPal Themenstarter:in
24 Beiträge seit 2011
vor 13 Jahren

noch irgendjemand eine Idee?

...

F
10.010 Beiträge seit 2004
vor 13 Jahren

Der code ist extrem schlecht lesbar und das meiste vollkommen überflüssig.

Warum sollte man die Daten einer DataTable aus einer anderen so umständlich von Hand copieren?
Warum benutzt du System.Type.GetType?

Was ist Liste?
Warum erstellst du per NewRow eine Zeile und benutzt diese dann nicht?
Warum machst du alles umständlicher als es sein muss?

PalPal Themenstarter:in
24 Beiträge seit 2011
vor 13 Jahren

siehe oben, noch nie mit DataGridview gearbeitet und daher Anleitungen aus diversen Foren genutzt...

Liste enthätl - wie es im Kommentar steht - einen Teil der zuvor dort gespeicherten SQL-Ergebnisse, zum beispiel alle Nachnamen der Mitarbeiter zu bestimmten Datensätzen.

die Frage "Warum erstellst du per NewRow eine Zeile und benutzt diese dann nicht?" verstehe ich leider nicht, da ich die Row hier nutze (fett markiert) um meine Daten zu übergeben. Das klappt auch einwandfrei

_ DataRow row = uebergabe.NewRow();
row["Vorname"] = Vorname;
row["Nachname"] = Nachname;_
uebergabe.Rows.Add(row["Vorname"], row["Nachname"])

Bevor ich das im vorherigen Post gezeigte Konstrukt geschrieben habe, habe ich mir Beschreibungen/Anleitungen/Foren-einträge zu DataGridviews angesehen und daraus entsprechend eine Lösung konstruiert.

Wie würde es denn weniger umständlich gehen? dazu war leider nichts (aufschlussreiches) irgendwo nachzulesen, zumindest habe ich nichts derart gefunden.

F
10.010 Beiträge seit 2004
vor 13 Jahren

Nein, du erstellst per NewRow eine Row, befüllst diese dann in den beiden nächsten Zeilen, und fügst dann die Werte darin der DataTable hinzu, die NewRow wird dann entsorgt.


uebergabe.Rows.Add(Vorname, Nachname)

Würde dann auch reichen.

Nocheinmal was ist Liste?
Eine DataTable?
Eine List<T>?

T
67 Beiträge seit 2010
vor 13 Jahren

die Frage "Warum erstellst du per NewRow eine Zeile und benutzt diese dann nicht?" verstehe ich leider nicht, da ich die Row hier nutze (fett markiert) um meine Daten zu übergeben. Das klappt auch einwandfrei

_ DataRow row = uebergabe.NewRow();
row["Vorname"] = Vorname;
row["Nachname"] = Nachname;_
uebergabe.Rows.Add(row["Vorname"], row["Nachname"])

Hinzufügen neuer Zeilen sollte an sich so aussehen:

DataRow row = tabelle.NewRow();
row["Spalte1"] = "wert";
row["Spalte2"] = "wert";
tabelle.Rows.Add(row);

Zu deinem Problem mit den Checkboxen im GridView. Bist Du dir sicher, dass Du "ReadOnly" auf FALSE gesetzt hast?

5.299 Beiträge seit 2008
vor 13 Jahren

von untypisierten Datasets rate ich immer ab.
Da die Properties untypisiert sind, und über String-Schlüssel zu addressieren sind, handelt man sich eine fiese Fehlerquelle ein.
Auch kann man an untypisiert gebundene DGVs nicht im Designer designen, und muß eiminent viel UserCode schreiben, um die richtig zu konfigurieren, was man eiglich alles dem Designer überlassen sollte, weil ders besser kann.
guggemol "DatasetOnly" auf Movie-Tuts

Ach, du hast ja eine DB hinterliegen, dann gugge vlt. auch "Datenbank in 10 Minuten" auf Movie-Tuts - da bekommst du auch den DB-Zugriff hingeneriert.

Auch das mit den Checkboxen kann sich in Luft auflösen, wenn du in der DataTable eine bool-Column hinterlegst. Dann generiert der Designer autom. eine korrekt konfigurierte CheckboxDatagridViewColumn dafür.
Ist natürlich eine Änderung am Datenmodell.

Der frühe Apfel fängt den Wurm.

R
158 Beiträge seit 2007
vor 13 Jahren

Folgende Vorgehensweise habe ich in einem meiner zahlreichen Projekte realisiert und es funktioniert tadellos.



/* dgvAdressen -> DataGridView
  datentabelle -> DataTable
\*/

//-- einmaliges Erstellen/konfigurieren des DGV
        internal void gridViewSpaltenErstellen()
        {	//-- ggf. mittels Designer eingestellte Properties:
            dgvAdressen.BorderStyle = BorderStyle.None;
            dgvAdressen.AutoGenerateColumns = false;	//WICHTIG!! SONST hauts dir ALLE Spalten aus der Tabelle auf den Schirm!
            dgvAdressen.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            //dgvAdressen.ReadOnly = true;
            dgvAdressen.RowHeadersVisible = false; // linkste Spalte mit dem Dreieck
            dgvAdressen.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;

            DataGridViewCheckBoxColumn colcb = new DataGridViewCheckBoxColumn();
            colcb.HeaderText = "";
            colcb.Width = 30;
            colcb.SortMode = DataGridViewColumnSortMode.NotSortable;
            dgvAdressen.Columns.Add(colcb);

            DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();

            col = new DataGridViewTextBoxColumn();
            col.HeaderText = "Firma";
            col.DataPropertyName = "K_Firma";
            col.Width = 300;
            col.ReadOnly = true;
            col.SortMode = DataGridViewColumnSortMode.NotSortable;
            dgvAdressen.Columns.Add(col);

            col = new DataGridViewTextBoxColumn();
            col.HeaderText = "Name";
            col.DataPropertyName = "K_Vorname";//-- K_Nachname wird für Newsletteranrede benutzt
            col.Width = 150;
            col.ReadOnly = true;
            col.SortMode = DataGridViewColumnSortMode.NotSortable;
            dgvAdressen.Columns.Add(col);

            col = new DataGridViewTextBoxColumn();
            col.HeaderText = "EmailAdresse";
            col.DataPropertyName = "EMail";
            col.Width = 320;
            col.ReadOnly = true;
            col.SortMode = DataGridViewColumnSortMode.NotSortable;
            dgvAdressen.Columns.Add(col);

        }

//-- Daten holen 

        void datenHolenUndTabelleFuellen()
        {//--Datenbank abfragen
            datentabelle = KontaktData.KontaktEmailAdressen();
            //--DataGridView an Tabelle binden
            dgvAdressen.DataSource = datentabelle;

			//--alle checkboxen erstmal auf Checked setzen
            for (int i = 0; i < dgvAdressen.RowCount; i++)
            {
                dgvAdressen.Rows[i].Cells[0].Value = true;
            }

        }


In diesem Beispiel kann der Benutzer auswählen, ob jmd. einen Newsletter erhalten soll oder nicht (je nachdem, ob in der ersten Spalte ( DataGridViewCheckBoxColumn) das Häkchen gesetzt ist).
Es kann also in einem DGV durchaus auch eine** ungebundene** Spalte enthalten sein 😉