| Autor |
Beitrag |
BlackMatrix
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Fr 05.08.11 16:53
Hi.
Ich habe eine DataTable, die eine Spalte mit dem Datentyp Uri aufweist. Nun möchte ich gerne, dass mein Benutzer eine Textbox hat wo er seine Uri eingibt und bei jedem neuen Buchstaben, das DGV gefiltert wird.
Demnach wollte ich auf das Ereignis TextChanged der Textbox reagieren und den Filter erstellen.
C#-Quelltext 1: 2: 3: 4:
| private void textBoxFilter_TextChanged(object sender, EventArgs e) { BindingSource.Filter = "uri='http://www.c-sharp-forum.de/'"; } |
Wie stelle ich nun aber den Filter ein, dass er den Wert in der Textbox mit Uris vergleichen kann?
Moderiert von Th69: Rechtschreibung im Titel ausgebessert.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 05.08.11 17:14
C#-Quelltext 1:
| BindingSource.Filter = string.Format("uri='{0}'", textBoxFilter.text); |
Naiv so. Vermutlich musst du den Textbox Inhalt aber noch in irgendeiner Form zurechttrimmen damit man dann vernünftig vergleichen kann. Vom User 100% Gleichheit bei der Eingabe inklusive Protokoll und Slashes an den richtigen Stellen (oder nicht) zu verlangen ist ein wenig zu hart. Ein Filter mit Like wäre da vielleicht sogar geeigneter.
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Fr 05.08.11 17:17
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 05.08.11 18:10
C#-Quelltext 1:
| BindingSource.Filter = string.Format("Convert(uri, 'System.String') ='{0}'", textBoxFilter.text); |
Das mit DataTable und Uri Type hatte ich überlesen. Obiges sollte gehen trotzdem hört sich das nicht besonders Clever an einen Uri Typ als Spalte in einer DataTable zuhalten sondern nach größeren Problemen. Du bist dir sicher das du eine DataTable brauchst? Und nicht einfach irgendeine generisches Liste von besser kontrollierbaren Klassen mit der URI und sonstigen Felden?
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Fr 05.08.11 18:18
Ich habe ein DGV, wo der Benutzer viele Eingaben machen und u.a. auch eine Uri angeben kann. Die eingegeben Daten werden in einer XML Datei abgespeichert und beim Neustart wieder geladen.
Ich hoffe das macht man so
Mir fällt gerade auf, dass das Starten des Progs ganz schön lange dauert (2 Sekunden), obwohl die XML erstmal 115KB groß ist.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 05.08.11 19:43
| Zitat: | | Ich hoffe das macht man so |
Kann man. Ich würde es aber nicht so machen. Eine DataTable ist ein Ding mit mir zuviel Overhead. Insbesondere wenn man gar nicht in einer DB speichern will. Wenn es dir um das Serialisieren in XML geht brauchst du dafür kein Dataset/DataTable. Der XMLSerializer oder einer der anderen Serializer aus dem Framework können so ziemlich jedes beliebige Objekt ohne großen Aufwand in XML oder ein anderes Format speichern und lesen.
|
|
Th69
      

Beiträge: 4809
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 05.08.11 19:55
Hallo BlackMatrix,
dazu kannst du dir auch mal den Artikel in der C#-Library www.c-sharp-library....und+laden_64947.html als ersten Einstieg durchlesen.
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Sa 06.08.11 12:48
Ralf Jansen hat folgendes geschrieben : | C#-Quelltext 1:
| BindingSource.Filter = string.Format("Convert(uri, 'System.String') ='{0}'", textBoxFilter.text); |
Das mit DataTable und Uri Type hatte ich überlesen. Obiges sollte gehen trotzdem hört sich das nicht besonders Clever an einen Uri Typ als Spalte in einer DataTable zuhalten sondern nach größeren Problemen. Du bist dir sicher das du eine DataTable brauchst? Und nicht einfach irgendeine generisches Liste von besser kontrollierbaren Klassen mit der URI und sonstigen Felden? |
Der Filter ist ziemlich genial, ich habe ihn noch auf: BindingSource.Filter = string.Format("Convert(uri, 'System.String') like '%{0}%'", textBoxFilter.text);
umgestellt und es wird immer sofort gefiltert
Das ist natürlich auch sehr elegant  Funzt auch bei meiner Testklasse, wenn ich aber meine richtigen Klasse, die eine Kindklasse meiner abstrakten Klasse ist, dann kommt:
| Zitat: | | Fehler beim Reflektieren des Typs... |
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Child child = new Child (); XmlWriterSettings xws = new XmlWriterSettings(); xws.Indent = true; xws.IndentChars = " "; XmlWriter xw = XmlWriter.Create("test.xml", xws); XmlSerializer xs = new XmlSerializer(typeof(Child)); xs.Serialize(xw, child); xw.Close(); |
|
|
Th69
      

Beiträge: 4809
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Sa 06.08.11 14:02
Hallo BlackMatrix,
erzeuge für deine Frage bzgl. des XmlSerialisers bitte ein neues Thema (ansonsten vermischt sich hier zuviel).
Edit: -> www.c-sharp-forum.de...ewtopic.php?t=106529
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Sa 15.10.11 18:02
Hab da nochmal eine Frage und erkenne den Unterschied nicht:
Ich habe jetzt mein DGV über eine BindingSource an eine Liste gebunden:
C#-Quelltext 1: 2: 3: 4:
| private List<User> User; private BindingSource BindingSource= new BindingSource(); BindingSource.DataSource = User; dataGridView1.DataSource = BindingSource; |
Wenn ich nun:
C#-Quelltext 1:
| BindingSource.Filter = string.Format("Convert(Url, 'System.String') like '%{0}%'", textBoxUrlFilter.Text); |
aufrufe ändert sich an der Anzeige des DGVs nichts. Das war bei der DataTable anders.
Und meine 2. Frage, (hoffe ein neues Thema ist dafür nicht notwendig):
Bei der Bindung einer Liste an das DGV lässt sich keine aufwärts/abwärts Sortierung der einzelnen Spalten mehr durchführen. Woran liegt das?
Liebe Grüße
|
|
Th69
      

Beiträge: 4809
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 16.10.11 09:18
Hallo BlackMatrix,
benutze anstatt der List<T> eine BindingList<T>, s. z.B. C# Tutorial - Binding a DataGridView to a Collection, BindingSource and BindingList Of T - DataBinding made simple! oder C# FORM: Binding DataGridView to List<T>
BindingList<T> implementiert die Schnittstelle IBindingList, so daß das DataBinding mit dem DGV dann einwandfrei klappt.
Dann sollte auch das Sortieren wieder funktionieren.
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: So 16.10.11 11:52
Danke für deine Antwort, aber wie wende ich dann einen Filter auf das DGV an, wenn ich keine BindingSource mehr dazwischen habe?
edit:
Gerade ausgetestet, sortieren scheint auch bei einer BindingList nicht zu funktionieren. Liegt das daran, dass mein erste Property einen Uri darstellt?
edit2: Ich habe gerade einfach mal ein einfache Klasse erstellt:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| class Car { public string Name { get; set; } public Car(string name) { Name = name; } } |
Und eine BindingList<Car> und an das DGV gebunden:
C#-Quelltext 1: 2: 3: 4:
| private BindingList<Car> Cars=new BindingList<Car>(); Cars.Add(new Car("Opel")); Cars.Add(new Car("Audi")); dataGridView1.DataSource = Cars; |
Ich kann die Marken nicht im DGV sortieren?!
|
|
Th69
      

Beiträge: 4809
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: So 16.10.11 12:42
Hallo BlackMatrix,
wenn du die Links genau gelesen hättest, dann hättest du gesehen, daß es auch Beispiele mit sowohl der BindingList als auch der BindingSource gibt.
Wenn du Filtern und Sortieren willst, laß also die BindingSource zwischen DGV und BindingList<T>.
|
|
BlackMatrix 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: So 16.10.11 12:55
Th69 hat folgendes geschrieben : | Hallo BlackMatrix,
wenn du die Links genau gelesen hättest, dann hättest du gesehen, daß es auch Beispiele mit sowohl der BindingList als auch der BindingSource gibt.
Wenn du Filtern und Sortieren willst, laß also die BindingSource zwischen DGV und BindingList<T>. |
Doch in der Tat habe ich mir die Links durchgelesen, da du jedoch gesagt hattest, dass ich eine BindingList verwenden soll, anstatt einer List mit BindingSource hatte ich mir das nicht genauer angeschaut.
Was mich aber gerade sehr viel mehr bewegt, wieso kann ich nicht sortieren? Ich dachte das ging schon mal, aber selbst bei meinem kleinen Objekt mit dem Car oben, kann ich nicht sortieren.
edit: Wie schön die BindingList auch sein mag, aber ein nicht sortierbares DGV bringt einem auch nichts.
|
|