Autor Beitrag
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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.

ausblenden 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 user profile iconTh69: Rechtschreibung im Titel ausgebessert.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 05.08.11 17:14 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Fr 05.08.11 17:17 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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.


Das funktioniert nicht.

ausblenden C#-Quelltext
1:
Die Operation '=' kann nicht an System.Uri und System.String durchgeführt werden.					
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 05.08.11 18:10 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4809
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Sa 06.08.11 12:48 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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 :)

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:

dazu kannst du dir auch mal den Artikel in der C#-Library www.c-sharp-library....und+laden_64947.html als ersten Einstieg durchlesen.


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...


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
            Child child = new Child ();//child of abstract Parent class
            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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4809
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
3:
4:
        private List<User> User;
        private BindingSource BindingSource= new BindingSource();
            BindingSource.DataSource = User;
            dataGridView1.DataSource = BindingSource;


Wenn ich nun:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4809
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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:

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4809
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: So 16.10.11 12:55 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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.