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 😦
Sobald du ein DGV bindest, muss jede spalte gebunden werden.
Welche spalte im DGV hast du denn an die ComboBoxColumn gebunden?
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?
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.
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.
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?
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.
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>?
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?
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.
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 😉