Autor |
Beitrag |
maxx
      
Beiträge: 70
|
Verfasst: Di 06.04.10 07:40
hello,
noch eine Frage zu DataGridViews.
Kann man darin eine Zeile einfügen, die nur aus TextBoxen besteht?
D. h.
Zeile 1: ganz normal die Header-Texte der Spalten
Zeile 2: zu jeder Spalte eine TextBox
Zeile 3-...: die normalen Inhalte
Ich würde dann nämlich gerne die Möglichkeit haben, in den TextBoxen Filterkriterien zu definieren (jeder TextBox-Eintrag entspricht dann einem SQL-LIKE).
Geht das? Ich habe wirklich absolut 0 Ahnung, wie ich das bewerkstelligen könnte.
|
|
norman2306
      
Beiträge: 222
Erhaltene Danke: 16
Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
|
Verfasst: Di 06.04.10 08:32
Das ginge schon, wäre aber schon alleine wegen der übersichlichkeit nicht unbedingt zu empfehlen. Ich würde dir empfehlen, für Filterkriterien eine eigene SQL-Like-Maske zu machen.
Falls du es mit der Zelle machen willst, probiere es mal damit
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| DataGridViewRow dgvRow = new DataGridViewRow(); DataGridViewCell dgvCell = null;
for(int i = 0; i< dataGridView.Columns.Count; i++) { dgvCell = new DataGridViewTextBoxCell() dgvCell.Value = "" dgvRow.Cells.Add(dgvCell) }
dataGridView.Rows.Insert(0, dgvRow); |
|
|
maxx 
      
Beiträge: 70
|
Verfasst: Di 06.04.10 12:39
Habe es jetzt versucht mit:
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:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent();
DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int)); table.Columns.Add("Drug", typeof(string)); table.Columns.Add("Patient", typeof(string)); table.Columns.Add("Date", typeof(DateTime));
table.Rows.Add(25, "Indocin", "David", DateTime.Now); table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now); table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now); table.Rows.Add(21, "Combivent", "Janet", DateTime.Now); table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
dataGridView1.DataSource = table;
DataGridViewRow dgvRow = new DataGridViewRow(); DataGridViewCell dgvCell = null; for(int i = 0; i< 4; i++) { dgvCell = new DataGridViewTextBoxCell(); dgvCell.Value = ""; dgvRow.Cells.Add(dgvCell); } dataGridView1.Rows.Insert(0, dgvRow); } } } |
Bekomme aber leider immer einen Fehler.
--- Moderiert von Narses: Beiträge zusammengefasst---
Hm ... moment mal.
Wenn mich nicht alles täuscht, SIND per Default alle Spalten TextBox-Spalten.
Wenn ich nun eine spezielle Zeile einfügen kann für die Filterungen (damit ich dort dann irgendeinen Text eingeben kann, wonach dann innerhalb dieser Spalte gefiltert wird), dann reicht das ev. schon, alle anderen Zeilen nicht editierbar zu machen und meine Filter-Zeile noch irgendwie farblich zu markieren.
Kann man das machen, dass grundsätzlich alle Zeilen read-only sind, jedoch nur die erste Zeile verändert werden kann?
|
|
maxx 
      
Beiträge: 70
|
Verfasst: Di 06.04.10 13:28
Ist doch noch komplizierter als gedacht. Hat man nämlich so eine Filter-Zeile, dann darf die nicht mitberücksichtigt werden, wenn man nach einer bestimmten Spalte sortieren möchte. Außerdem sollte der Cell-Typ immer String sein. Und natürlich sollte diese Zeile die einzige sein, die man editieren kann.
Probleme, Probleme, ...
Ich glaube, das geht gar nicht.
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Di 06.04.10 13:30
Also den Filter als Wert in die Zeile aufzunehmen hört sich böse an ;o
Bist du auf WinForms beschränkt oder kannst du auch WPF nehmen?
|
|
maxx 
      
Beiträge: 70
|
Verfasst: Di 06.04.10 13:52
WPF kenn ich nicht.
Also ich würde das gerne so machen:
Quelltext 1: 2: 3: 4: 5:
| Header-Zeile (in weiß): ID Name Ort Filter-Zeile (in weiß): __ ____ ___ (Striche sind nur Platzhalter) die Daten (in grau, read-only): 1 ich hier 2 du da 3 er dort |
Und dann sollte man in der Filter-Zeile je Spalte eingeben können, wonach gefiltert werden soll. Z. B.:
Quelltext 1: 2: 3: 4: 5:
| Header-Zeile (in weiß): ID Name Ort Filter-Zeile (in weiß): __ d d die Daten (in grau, read-only): 1 ich hier 2 du da 3 er dort |
Da es nur in Zeile 2 ein d im Name und ein d im Ort gibt, würde dann angezeigt werden:
Quelltext 1: 2: 3:
| Header-Zeile (in weiß): ID Name Ort Filter-Zeile (in weiß): __ d d die Daten (in grau, read-only): 2 du da |
Leider schaffe ich das nicht alleine. Es gibt zwar unterschiedlichste Eigenschaften für das DataGridView. Aber seltsamerweise zeigen die absolut keine Wirkung bei mir. Schon mit readonly auf rows versucht. Geht nicht. Schon versucht mit Event SortCompare. Geht nicht.
|
|
maxx 
      
Beiträge: 70
|
Verfasst: Di 06.04.10 14:04
Ein Problem konnte ich schon lösen.
C#-Quelltext 1: 2: 3: 4: 5:
| private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { if(e.RowIndex > 0) e.Cancel = true; } |
Bewirkt, dass man nur die erste Zeile editieren kann.
Bleiben noch folgende Probleme:
- Sortieren: erste Zeile darf nicht mit sortiert werden
- Zellentyp: Zellen der ersten Zeile sollten alle vom Typ string sein
|
|
maxx 
      
Beiträge: 70
|
Verfasst: Di 06.04.10 14:38
Habe mir jetzt angeschaut: msdn.microsoft.com/e...ibrary/ms171608.aspx
Übergibt man einem DGV einen DataTable, kann man das anscheinend vergessen. Habe versucht, alle Zeilen zu sortieren, außer der ersten Zeile (meine Filter-Zeile).
Variante 1 reicht für mein Vorhaben nicht.
Variante 2 funktioniert bei mir wahrscheinlich gar nicht. Hatte schon versucht, mit dem SortCompare-Event irgendwas zu machen. Das scheint bei mir aber nie aufgerufen zu werden.
Variante 3 habe ich ausprobiert, hat auch funktioniert. Jedoch scheint das mit einem DataTable dann nicht mehr zu funktionieren. Dann kann er nicht mehr soriteren.
Das einzige, was anscheinend funktioniert:
C#-Quelltext 1:
| dataGridView1.Columns["Dosage"].SortMode = DataGridViewColumnSortMode.Programmatic; |
Damit kann man das Soriteren deaktivieren.
Aber vielleicht fällt euch noch irgendwas ein 
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Di 06.04.10 14:44
Also damit deaktivierst du es bestimmt nicht ... siehe MSDN.
Ich hatte vorhin nicht gefragt ob du WPF kennst, sondern ob WinForms zwingend Notwendig ist.
Mir ist unklar, warum du unbedingt diese zweite Zeile als Filter missbrauchen willst... Das macht die Sache ja nur unnötig kompliziert. Willst du eine Eingabe oder eine Suchmaske? Warum Verwendest du nicht einfach ein TextBox/ListBox mit autocomplete?
|
|
maxx 
      
Beiträge: 70
|
Verfasst: Di 06.04.10 15:04
So eine Variante habe ich aktuell. Ich habe ein Control, das aus folgenden Elementen besteht:
- Elemente zum Blättern
- TextBox, in der ich angebe, wie viele Zeilen pro Seite im DGV angezeigt werden sollen
- eine TextBox, die ich fürs Filtern verwende
Dieses Control sollte universell verwendbar sein. Im DGV können beliebig viele Spalten sein, jedoch habe ich aktuell nur eine einzige TextBox, in der ich einen Filter definieren kann.
Jetzt müsste ich im Control schauen, wie viele Spalten im DGV sind. Dann müsste ich mir die Spaltennamen suche und zu jeder Spalte dynamisch mehrere TextBoxen machen, so ich dann praktisch je Spalte einen Filter definieren könnte.
Das war mir irgendwie zu umständlich und vor allem irgendwie nicht wirklich übersichtlich und intuitiv bedienbar. Darum bin ich auf die Idee gekommen, innerhalb des DGV eine Zeile vorzusehen, wo man gleich direkt überall je Spalte einen Filter definieren könnte.
Zum Thema sortieren: Programmiert man nichts spezielles dazu, wirkt Programmatic im Endeffekt genau so wie NotSortable (wahrscheinlich).
|
|
maxx 
      
Beiträge: 70
|
Verfasst: Di 06.04.10 15:18
So eine Variante habe ich aktuell. Ich habe ein Control, das aus folgenden Elementen besteht:
- Elemente zum Blättern
- TextBox, in der ich angebe, wie viele Zeilen pro Seite im DGV angezeigt werden sollen
- eine TextBox, die ich fürs Filtern verwende
Dieses Control sollte universell verwendbar sein. Im DGV können beliebig viele Spalten sein, jedoch habe ich aktuell nur eine einzige TextBox, in der ich einen Filter definieren kann.
Jetzt müsste ich im Control schauen, wie viele Spalten im DGV sind. Dann müsste ich mir die Spaltennamen suche und zu jeder Spalte dynamisch mehrere TextBoxen machen, so ich dann praktisch je Spalte einen Filter definieren könnte.
Das war mir irgendwie zu umständlich und vor allem irgendwie nicht wirklich übersichtlich und intuitiv bedienbar. Darum bin ich auf die Idee gekommen, innerhalb des DGV eine Zeile vorzusehen, wo man gleich direkt überall je Spalte einen Filter definieren könnte.
Zum Thema sortieren: Programmiert man nichts spezielles dazu, wirkt Programmatic im Endeffekt genau so wie NotSortable (wahrscheinlich).
EDIT:
Allerdings ist mir jetzt gerade etwas bewusst geworden. Meine Tabelle kann sich über mehrere Seiten ziehen. Besteht die Tabelle aus 100 Datensätzen und sollen immer nur 20 Datensätze angezeigt werden, hätte man 5 Seiten. Wenn ich die Filter-Einträge direkt im DataGridView mache, könnte das ev. missverständlich sein. Die Frage ist: was sortiere ich dann eigentlich? Nur die Einträge der aktuellen Seite oder grundsätzlich alle Datensätze? Das könnte zu Misverständnisse führen.
Mache ich aber die Filtereinträge außerhalb des DGVs, dann sollte es klar sein, dass ALLE Datensätze sortiert (und neu angezeigt) werden.
Ich glaube, die Idee, die Filtereinträge im DGV vorzunehmen, war sowieso nicht gut ...
Ich befürchte, die Bedienung ist dann nicht intuitiv.
Ich bleib wohl doch bei der alten Variante.
|
|
|