| Autor |
Beitrag |
Felix2000
      
Beiträge: 124
|
Verfasst: Fr 05.08.11 10:48
Hi Folks !
Ich habe eine Frage an euch. Es geht mir hierbei eher weniger um Programmierung einer konkreten Sache, sondern im Allgemeinen darum, ein Problem sinnvoll zu lösen, was mir bisher auch nach einigen Denkperioden immernoch nicht gelungen ist.
Folgendes Szenario ist gegeben:
Es sollen Daten, die aus einer umfangreichen Datenbanktabelle kommen (mit vielen Spalten, so ca. 22 Spalten und sehr vielen Zeilen, ungefähr zwischen 1500 bis zu 4000 Zeilen), sinnvoll und für den Benutzer übersichtlich auf einer einzigen Benutzeroberfläche dargestellt werden können.
Bitte nicht denken "Oh Gott soviele Zeilen, wie soll dass gehen". Man kann natürlich mittels Filter die Zeilen, die in der Benutzeroberfläche dargestellt werden sollen, auch etwas einschränken.
Bisher habe ich es so gelöst, dass die Daten aus der Datenbanktabelle in Form eines Eins-zu-Eins-Abbildes in Tabellenform bzw. in einem entsprechenden Tabellenobjekt auf der Benutzeroberfläche ausgegeben werden (siehe hierzu auch den Screenshot in dem Anhang der Frage).
Doch das Eins-Zu-Eins-Abbild der Datenbanktabelle in einem Tabellenobjekt (in C# ist das das Objekt DatagridView) auf einer Benutzeroberfläche ist für mich eher derzeit eine suboptimale Lösung, zumal es einfach schwierig und anstrengend zu lesen ist. Auch ist in meinen Augen eine sinnvolle Bearbeitung der datensätze über dieses Objekt nicht umzusetzen.
Außerdem möchte ich über diese Benutzeroberfläche diese Datensätze direkt bearbeiten. Bisher ist es so geregelt, dass man dazu jeden einzelnen Datensatz in dem Tabellenobjekt "anfassen" muss, um ihn zu bearbeiten. Das ist bei der Menge an Datensätzen finde ich nicht zumutbar.
Hier wäre es schön, wenn man Datensätze, die man konkret bearbeiten möchte, per Häkchen auf der Benutzeroberfläche markieren könnte und dann irgendwann alle per Häkchen markierte Datensätze per Mausklick (z.B. auf einem separaten Button) entsprechend abarbeiten könnte (z.B. alle markierten Datensätze jetzt löschen, oder ausgelagern oder sonst irgendeinen SQL Befehl dazu im Hintergrund absetzen).
Habt ihr vielleicht irgendeine Idee, wie man solche Datenmengen sinnvoll und benutzerfreundlich über eine Benutzeroberfläche darstellen und strukturieren könnte?
Noch eine ganz wichtige Info: Diese umfangreiche Datenbanktabelle ist fest vorgegeben und ich habe leider keine Möglichkeit, sie in weitere Tabellen aufzusplitten.
Danke für eure Hilfestellungen !!
Greetz
Felix
Einloggen, um Attachments anzusehen!
|
|
Betasteter
      
Beiträge: 19
WinXP
C# (VS 2008)
|
Verfasst: Fr 05.08.11 12:28
Wenn ich das richtig verstehe, ist dein DGV überfrachtet mit Zeilen und Spalten.
Zu den vielen Spalten:
Du könntest dein DGV nur die wichtisten 3-5 Spalten anzeigen lassen, und die restlichen Werte in Textboxen oder ähnlichem anzeigen lassen, wenn ein Datensatz angewählt wird.
Zu den vielen Zeilen:
Du solltest mehrere Filtermöglichkeiten schaffen, und eventuell beim Start des Programms zunächst einmal alle Datensätze ausfiltern, so dass der Benutzer gezwungen ist, nur gewünschte Datensätze anzuzeigen.
Zum gleichzeitigen Bearbeiten mehrerer Zeilen:
DGVs bieten doch die Möglichkeit mehrere Zeilen zu markieren, reicht das nicht zur gleichzeitigen Bearbeitung?
Gruß
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Fr 05.08.11 12:39
Danke für die Antwort !
Ich nehmen mal an, dass Du mit der Abkürzung DGV das DataGridView Objekt meinst?
Wie genau meinst Du das, dass man die restlichen Werte in Textboxen anzeigen lassen kann? Ich verstehe das ehrlich gesagt nicht ganz.
Du hast schon recht, dass man in dem dataGridView mehrere Datensätze markieren und dann weiterverarbeiten kann, aber ich finde dass das keine sehr benutzerfreundliche Handhabung ist. Ich würde die Lösung mit dem separarten Häkchen setzen am optimalsten finden !!
Greetz
Felix
|
|
Betasteter
      
Beiträge: 19
WinXP
C# (VS 2008)
|
Verfasst: Fr 05.08.11 12:51
Ja, DGV ist die Abkürzung für DataGridView.
Felix2000 hat folgendes geschrieben : |
Wie genau meinst Du das, dass man die restlichen Werte in Textboxen anzeigen lassen kann? Ich verstehe das ehrlich gesagt nicht ganz.
|
Beispiel:
Dein DGV ist links und nimmt etwa die Hälfte des Forms ein. Rechts davon sind Textboxen, RichTextBoxen, Labels oder was auch immer.
Du machst alle Spalten des DGV bis auf 3 unsichtbar.
Bei einem Klick auf eine Zeile ermittelst du die restlichen 19 Werte und lässt sie anschaulich in den Controls (Textboxen etc.) rechts anzeigen.
Du könntest die Daten auch auf die Art bearbeiten:
Eine Zeile wird ausgewählt, deren Werte in Textboxen angezeigt. Unter den Textboxen oder oben in einem Toolstrip befindet sich ein "Speichern" button.
Nachdem die Werte in den Textboxen geändert wurden kannst du sie nach einem Klick auf den Speichern Button in die Tabelle zurückschreiben.
Felix2000 hat folgendes geschrieben : |
Du hast schon recht, dass man in dem dataGridView mehrere Datensätze markieren und dann weiterverarbeiten kann, aber ich finde dass das keine sehr benutzerfreundliche Handhabung ist. Ich würde die Lösung mit dem separarten Häkchen setzen am optimalsten finden !!
|
Ist auf jedenfall schneller als mit Checkboxen, aber jedem das Seine. Du kannst zur Laufzeit eine Spalte im DGV hinzufügen, die Checkboxen enthält:
Quelltext 1:
| DataGridViewCheckBoxColumn dgvCheckboxCol = new DataGridViewCheckBoxColumn(); |
Gruß
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Fr 05.08.11 13:08
Danke für den Beitrag !
Kannst Du mir vielleicht nochmal ganz genau erläutern, wie ich zur Laufzeit einen bereits vorhandenen DGV diese speziellen Checkboxen hinzufügen kann? Hier ist der Code, den mir der Designer generiert hat, nachdem ich über die Toolbox dieses Objekt auf meiner Benutzeroberfläche plaziert habe:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| private void InitializeComponent() { this.data_TableValue = new System.Windows.Forms.DataGridView(); ((System.ComponentModel.ISupportInitialize)(this.data_TableValue)).BeginInit(); this.SuspendLayout(); this.data_TableValue.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.data_TableValue.Location = new System.Drawing.Point(99, 203); this.data_TableValue.Name = "data_TableValue"; this.data_TableValue.Size = new System.Drawing.Size(779, 217); this.data_TableValue.TabIndex = 2; this.data_TableValue.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellContentClick); } |
Thanks !
Greetz
Felix
Moderiert von Th69: B- durch C#-Tags ersetzt
|
|
Betasteter
      
Beiträge: 19
WinXP
C# (VS 2008)
|
Verfasst: Fr 05.08.11 13:32
Du brauchst gar nicht in den Designer-Code zu gehen.
Irgendwann beim Start des Programms, zum Beispiel im MainForm_Load() Event:
Quelltext 1: 2: 3:
| DataGridViewCheckBoxColumn dgvCheckboxCol = new DataGridViewCheckBoxColumn();
dataGridView.Columns.Add(dgvCheckboxCol); |
Dabei wäre relevant, ob und wann du die Daten "refreshst", und wie du die Daten in das DGV bekommen hast.
Wenn du während der Arbeit mit dem Programm die Daten nicht nochmal neu lädst, kannst du die Spalte einmalig hinzufügen.
Wenn du das DGV an die Datenbank gebunden hast und irgendwann während der Arbeit die Daten neu lädst, musst du auch die Checkbox Spalte neu hinzufügen.
Gruß
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Fr 05.08.11 14:42
Super vielen Dank !
Vielleicht könnte ich auch so mein Problem lösen. Könnte man dann eigentlich auf die Datensätze, die dann mit einem Haken markiert worden sind, bestimmte Operationen ausführen? Also z.B. über einen separaten Button auf der Oberfläche oder so?
Greetz
Felix
|
|
Betasteter
      
Beiträge: 19
WinXP
C# (VS 2008)
|
Verfasst: Fr 05.08.11 14:59
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Fr 05.08.11 15:33
Super Danke !!!
Also wäre es rein theoretisch möglich, zuerst alle "angehakten" Zeilen zu zählen, diese Anzahl dann in einer variable zu speichern, dann ein 2 Dimensionales Array mit einer Länge anzulegen, die ich zuvor ermittelt habe und die markierten Datensätze dann darin zu speichern?
Greetz
Felix
|
|
Betasteter
      
Beiträge: 19
WinXP
C# (VS 2008)
|
Verfasst: Fr 05.08.11 15:53
Ja das wäre möglich.
Allerdings kannst du das auch im selben Zug tun:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| DataRow[] selektierteDataRows = new DataRow[0]; foreach (DataGridViewRow in dataGridView.SelectedRows) { if ((bool)dgvRow.Cells["Name der Checkbox Spalte"].Value == true) { DataRow dataRow = ((DataRowView)dgvRow.DataBoundItem).Row; Array.Resize(ref selektierteDataRows, selektierteDataRows.Length + 1); selektierteDataRows[selektierteDataRows.Length - 1] = dataRow; } } |
Damit bekommst du ein Array mit nur den DataRows, die über die Checkbox Spalte selektiert sind.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 05.08.11 17:12
Eine List<DataRow> wäre dafür geeigneter als ein Array. Und Vergleiche auf true sind redundant  .
_________________ >λ=
|
|
Betasteter
      
Beiträge: 19
WinXP
C# (VS 2008)
|
Verfasst: Mo 08.08.11 08:25
Ja, bei Eigenschaften des Typs object vergess ich das immer  .
Danke für den List Tip.
|
|
Felix2000 
      
Beiträge: 124
|
Verfasst: Mo 08.08.11 10:13
Hi Folks again !
Ich habe noch einmal eine Frage zu dem Thema. Aber an dieser Stelle noch einmal ein Danke schön für die bisherigen Hilfestellungen!! Es geht konkret um dieses Stückchen C Sharp Code:
C#-Quelltext 1: 2: 3: 4: 5:
| foreach (DataGridViewRow dgvRow in dataGridView.Rows){ if ((bool)dgvRow.Cells["Name der Checkbox Spalte"].Value == true) { DataRow dataRow = ((DataRowView)dgvRow.DataBoundItem).Row; } |
Ich würde nun gerne in allen Zeilen, die mit einem Häkchen durch einen Benutzer selektiert wurden, in einer ganz bestimmte Spalte automatisch einen festen Wert eintragen (z.B. den Textstring wie "wude selektiert") und dieses sollte dann auch in die Datenbnaktabelle eingetragen werden. Weiß vielleicht jemand, wie ich das bewerkstelligen könnte?
Greetz
Felix
//Offtopic
Wie genau kann ich hier im Forum eigentlich C# Code als Code darstellen. Ich finde dazu die entsprechende Funktion nicht?!
Thanks !!
Moderiert von Th69: B- durch C#-Tags ersetzt
|
|
Betasteter
      
Beiträge: 19
WinXP
C# (VS 2008)
|
Verfasst: Mo 08.08.11 12:22
|
|
Th69
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 08.08.11 13:14
Hallo Felix2000,
unter "Bereiche" gibt es den Eintrag "C#". Alternativ [ cs ] ... [ /cs ] (ohne die Leerzeichen) im Editor eingeben.
(Code nur für allgemeine Sachen z.B. Pseudo-Code o.ä. benutzen)
Und Betasteter meinte wohl eher "Spalte", also:
C#-Quelltext 1: 2:
| dataRow["Ganz bestimmte Spalte"] = "wurde selektiert"; |
Zuletzt bearbeitet von Th69 am Mo 08.08.11 13:53, insgesamt 1-mal bearbeitet
|
|
Betasteter
      
Beiträge: 19
WinXP
C# (VS 2008)
|
Verfasst: Mo 08.08.11 13:20
richtig, danke 
|
|