Autor Beitrag
ihmSelbst
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 10.12.14 14:25 
Hallo zusammen,

auch auf die Gefahr hin, dass ich als Anfänger fast gesteinigt werde, habe ich dennoch die Absicht eine Beginner-Frage zu posten und hoffe auf eine einfache Lösung.

Hier mal ein Versuch mein DataGridView mit Werten zu versehen:

ausblenden volle Höhe C#-Quelltext
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:
        
    void getArticleList()
        {
            const string user = "USR";
            const string pass = "PW";

            var client = new RestClient(@"http://www.domain.de/api") { Authenticator = new DigestAuthenticator(user, pass) };
            var request = new RestRequest("/articles/", Method.GET);
            var response = client.Execute(request);
            request.AddHeader("Content-Type""application/json; charset=utf-8");

            if (response.ErrorException != null) { MessageBox.Show(response.ErrorException.Message); }
            else
            {                            
                // Artikel holen
                var content = response.Content;
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                dynamic jsonObject = serializer.Deserialize<dynamic>(content);
                dynamic articles = jsonObject["data"];

                // DataGrid aufbauen

                dataGridView1.ColumnCount = 2;
                dataGridView1.Columns.Insert(0new DataGridViewCheckBoxColumn { Name = "Chk", Width = 30 });
                dataGridView1.Columns[1].Name = "Id";
                dataGridView1.Columns[1].Width = 30;
                dataGridView1.Columns[2].Name = "Name";
                dataGridView1.Columns[2].Width = 350;

                foreach (var items in articles)
                {
                    string[] row = new string[] { null, items["id"].ToString(), items["name"].ToString() };
                    dataGridView1.Rows.Add(row);
                }
            }
        }


Klappt auch soweit ganz prima.. Wenn ich nun allerdings auf "id" klicke, erhalte ich als Sortierung 0, 1, 10, 100, 101 ... 109, 11, 110, 111 usw...

Er sortiert also um es mal mit meinen Worten auszudrücken nach "String". Ich möchte aber nach "int" sortieren, also 0...9, 10, 11 ..

Jetzt habe ich schon den halben morgen gegoogelt und auch Begriffe wie "IComperer" gefunden, komme aber damit nicht wirklich zurecht.
Hat jemand eine ganz einfache Lösung für mich?

Ich bedanke mich im Voraus für die Unterstützung.

ihmSelbst
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: Mi 10.12.14 14:55 
Du solltest die Spalten nicht als string betrachten sondern als ihren tatsächlichen Datentyp.

Problem beginnt wohl damit das du es dynamisch versuchst, bei dieser Codezeile dynamic jsonObject = serializer.Deserialize<dynamic>(content); fällt mir als Kommentar eigentlich nur "Aua" ein, obwohl du ganz offensichtlich die Struktur des json kennst und welche Properties das enthält. Insofern würde ich dir raten eine entsprechende Klassenentsprechung zu programmieren mit den passenden Typen für jedes Attribut und das an das Grid zu binden. Sobald das Grid dann weiß das die Spalte ein int, long oder was auch immer ist wird dann auch richtig sortiert. Und du hast als Bonus auch noch eine Klasse mit der man richtig arbeiten kann. Meistens zeigt man ja Sachen nicht nur an sondern macht auch irgendwas damit ;)

In deinem konkreten Code ist das Problem das du alles als strings annimmst. Du solltest die Id also als passenden Typ übergeben und den Columns sagen was sie für ein Typ sind. Vermutlich so

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
                dataGridView1.ColumnCount = 2;
                dataGridView1.Columns.Insert(0new DataGridViewCheckBoxColumn { Name = "Chk", Width = 30 });
                dataGridView1.Columns[1].Name = "Id";
                dataGridView1.Columns[1].ValueType = typeof(long); // oder Int32 das weißt du besser
                dataGridView1.Columns[1].Width = 30;
                dataGridView1.Columns[2].Name = "Name";
                dataGridView1.Columns[1].ValueType = typeof(string); 
                dataGridView1.Columns[2].Width = 350;

                foreach (var items in articles)
                {
                    object[] row = new object[] { null,  Convert.ToInt64(items["id"]), items["name"].ToString() };
                    dataGridView1.Rows.Add(row);
                }


Zitat:
auch auf die Gefahr hin, dass ich als Anfänger fast gesteinigt werde, habe ich dennoch die Absicht eine Beginner-Frage zu posten und hoffe auf eine einfache Lösung.


Virtuelle Steinigung veranstalten wir Freitags ab halb zehn falls du teilnehmen möchtest. Je nach Geschlecht den virtuellen falschen Bart nicht vergessen.

Für diesen Beitrag haben gedankt: ihmSelbst
ihmSelbst Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 10.12.14 16:09 
Lieber Ralf,

erstmal Danke für Deine schnelle Hilfe...

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Du solltest die Spalten nicht als string betrachten sondern als ihren tatsächlichen Datentyp.

Insofern würde ich dir raten eine entsprechende Klassenentsprechung zu programmieren mit den passenden Typen für jedes Attribut und das an das Grid zu binden. Sobald das Grid dann weiß das die Spalte ein int, long oder was auch immer ist wird dann auch richtig sortiert. Und du hast als Bonus auch noch eine Klasse mit der man richtig arbeiten kann. Meistens zeigt man ja Sachen nicht nur an sondern macht auch irgendwas damit ;)


Habe ich getan. Dazu habe ich auch ein online-Tool gefunden was mir aus dem Json eine Klasse generierte - Sehr praktisch... Zugegeben der von Dir vorgeschlagene Weg macht wesentlich mehr Sinn und sieht auch noch besser aus ;-)

Hier mal ein Auszug aus meinem weltbekannten und neuen Bestseller "Code ist Poesie 2.0" (Mädchen-Code-Edition) ;-)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
                // Artikel holen:
                ShopwareArticles shopwareArticles = new JavaScriptSerializer().Deserialize<ShopwareArticles>(response.Content);

                foreach (var items in shopwareArticles.data)
                {
                    dataGridView1.Rows.Add(null, items.id, items.name);
                }


user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Virtuelle Steinigung veranstalten wir Freitags ab halb zehn falls du teilnehmen möchtest. Je nach Geschlecht den virtuellen falschen Bart nicht vergessen.

Danke für den Hinweis, werde gucken, dass ich bin dahin meine virtuelle rasur ausfallen lasse ;-)

Alles Gute
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: Mi 10.12.14 16:24 
Wenn du deine Spaltendefinition aus dem Code wegwirfst und im Winforms Designer mal in den Properties des Grids DataSource raussuchst und aufklappst findest du dort denn Punkt 'Add Project Data Source...'. Dort deine generierte Klasse auswählen und du erhälst Code Poesie 3.0 einschließlich der Möglichkeit die Spalten sauber im Designer zu designen.

ausblenden C#-Quelltext
1:
2:
ShopwareArticles shopwareArticles = new JavaScriptSerializer().Deserialize<ShopwareArticles>(response.Content);
dataGridView1.DataSource = shopwareArticles.data;

Für diesen Beitrag haben gedankt: ihmSelbst