Autor Beitrag
Thommy0606
Hält's aus hier
Beiträge: 15

Win XP
C# (VS2008 Express)
BeitragVerfasst: Mo 04.04.11 12:42 
Hallo zusammen

ich habe 2 Fragen zum Datagridview Element.

Zuerst kurz etwas zum Projekt. Ich habe ein Abfrageprogramm welches aus einer Datenbank (Access)Produktionszahlen ausliest und mittels Datagridview zur anzeige bringt. Der Anwender hat dabei die Möglichkeit sowohl den Abfragezeitraum als auch die auszuwählen. Soweit funktioniert alles super.

Jetzt zu meinen Fragen:

1. Die Produktionszahlen liegen zwar alle in einer Tabelle haben aber unterschiedliche Spalten je nach Anlage. Wenn jetzt eine Anlage auswähle und sie mir anzeigen lasse werden bei der ersten Abfrage nur die benötigen Spalten angezeigt.
Bei jeder weiteren Abfragen kommen die Spalten der nächsten abfrage hinzu und das DatGrid verliert an Übersichtlichkeit. Die einzelnen Abfragen werden "manuell" zu einen Commandobjekt zusammengefasst und an die Datenbank gesendet. Was ich wissen möchte wie bekomme ich es hin, das immer nur gerade benötigten Palten angezeigt werden? DataSet.Delete() geht leider nicht.

2. Das zweite Problem ist, das meine Anwender gerne eine Summenzeile hätte, die die Summe der in den jeweiligen Spalten angezeiten Zahlen anzeigen soll. Die Summe soll nur die Zahlen addieren die im DataGrid angezeigt werden. Ich habe schon einiges mit COUNT versucht bin aber bis jetzt schon daran gescheidert, die Abfrage an das mit der Auswahl zu verknüpfen geschweige den mehrere Spalten zu zählen oder diese gar anzuzeigen.

Ich denke das 1. Problem kann bestimmt relativ einfach lösen. Das 2. sehe ich als größeres Problem an. Ich habe natürlich meine dicken sclauen Bücher nach Lösungen durchsucht, habe keinen Lösungsanzatz gefunden. Auch Google konnte mir nicht wirklich weiterhelfen. Deshalb wende ich mich an euch!

Für alle Mühe möchte ich mich schon einmal im vorraus bei allen bedanken!

Gruß Thomas
Thommy0606 Threadstarter
Hält's aus hier
Beiträge: 15

Win XP
C# (VS2008 Express)
BeitragVerfasst: Do 07.04.11 10:41 
Hallo

kann mir hier niemande Helfen????????? :flehan: :?:
m-s
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: Do 07.04.11 11:22 
Zu eins habe ich keinen Plan.
Zu 2, meinst Du eine Summen Spalte oder Zeile?

_________________
Gruß Markus
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Do 07.04.11 11:35 
Poste dochmal den Part deines Codes, wo du die Daten zuweist. Dein Posting ist extrem lang und auch etwas schwer verständlich. Ich schätze mal, du arbeitest mit Daten-Bindung?

Also prizipiell kann man als DatenBindungsobject ein Query verwenden:

Bsp:


Man hat eine Klasse mit Daten
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public class ExampleDataPoint
{
    public double A { get; set; }
    public double B { get; set; }
    public double C { get; set; }
    public double D { get; set; }
}


Aus der man eine Liste oder sonst ein IEnuerable hat -> myData as IEnumerable<ExampleDataPoint>. Dann kann man dem Grid als Source folgendes zuweisen:


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
     myDataGrid.ItemSource = from itm in myData 
                             [where condition(myData)] //optionales Statement
                             select new
                             {
                                 itm.A,
                                 itm.B,
                                 Summe = itm.A + itm.B
                             }


Das wäre natürlich alles viel einfacher und verständlicher zu erklären, wenn du mal die entsprechenden Codeschnippsel postest.
Thommy0606 Threadstarter
Hält's aus hier
Beiträge: 15

Win XP
C# (VS2008 Express)
BeitragVerfasst: Do 07.04.11 13:39 
Hallo
Danke für für eure Antworten. Ich meine die Summe der Spalte, wobei die Anzahl der Spalten und Zeilen von der Abfrage abhängig sind (also völlig variabel). Die Daten stehen in einer Access DB in einer Tabelle und werden selektiert ausgelesen. Das Auslesen erfolg mittels SQL Comandstrings.

Norman die Zuweisung erfolgt über das DataSet welches das Abrageergebnis des SQL Strings beinhaltet dies ist mein Datatsource. DataMember ist der Name dem ich den DataSet gegeben habe. Ich werde mal versuchen das ganze zu posten und hoffe das es Klappt. Habe das vor längerer Zeit erst einmal gemacht. Das ganze ist über 2 Klassen verteilt deshalb versuche ich beide zu posten.
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:
  class Datenbank
    {
        //public static string sqlstr = "";
        public static string error = "";
        public static DataSet ds = new DataSet();
        public static OleDbDataAdapter da = new OleDbDataAdapter();
       
        public static string Daten_Lesen (string sqlstr)
        {
            string connstr = "Provider = Microsoft.Jet.OLEDB.4.0;" +
            "Data Source = G:\\Fertigung\\FI\\Laser_Daten.mdb;";

            OleDbConnection conn = new OleDbConnection(connstr);
            da = new OleDbDataAdapter(sqlstr, conn);
            
            ds.Clear();

            try
            {
                conn.Open();
                da.Fill(ds, "Stück");
                conn.Close();
                return error = "";
            }
            catch (Exception ex)
            {
                return error = ex.ToString();
            }
        }
    }

 private void DataGrid()
        {
            dataGridView1.DataSource = Datenbank.ds;
            dataGridView1.DataMember = "Stück";
        }


Sorry ich weiß nicht mehr wie ich das in diese Boxen rein bekomme. Ich hoffe ihr könnt trotzdem was damit anfangen. Das obere ist die Datenbankabfrage kompeltt (eigene Klasse Datenbank) und das untere die DataGrid zuweisung aus Form1.cs.

Danke für eure Hilfe!!!!

Moderiert von user profile iconKha: C#-Tags hinzugefügt
Einloggen, um Attachments anzusehen!
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Do 07.04.11 14:24 
Da mit dem Rahmen erreichst du, indem du

<span class="inlineSyntax">{PROTECTTAG54f44f447260834ffcfe70b9aff34427}</span>

schreibst. Daraus wird dann:

ausblenden C#-Quelltext
1:
Dein Code kommt hierher					



Aber jetzt mal zu deinem eigentlichen Problem. Einfach eine Zeile hinzufügen könnte in deinem Fall etwas schwer werden. Mir fällt auf anhieb ehrlich gesagt keine Variante in C# 3.5 ein. Das Problem ist die Variable Anzahl an Spalten. In C# 4.0 gibt es eine noch recht elegante Lösung dafür, in dem man einen DynamicObject-Wrapper drumlegt, aber in 3.5 könnte das recht schwierig werden. Vielleicht hat ja noch jemand anderes eine Idee...

Sonst musst du eben aus deiner Table per Hand eine neue generieren. Das ist zwar ätzend langsam, geht aber dafür in 3.5
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 07.04.11 15:11 
user profile iconnorman2306 hat folgendes geschrieben Zum zitierten Posting springen:
Mir fällt auf anhieb ehrlich gesagt keine Variante in C# 3.5 ein. Das Problem ist die Variable Anzahl an Spalten. In C# 4.0 gibt es eine noch recht elegante Lösung dafür, in dem man einen DynamicObject-Wrapper drumlegt, aber in 3.5 könnte das recht schwierig werden. Vielleicht hat ja noch jemand anderes eine Idee...
Wiewas, es geht doch um ein untypisiertes DataSet :gruebel: ?

user profile iconThommy0606 hat folgendes geschrieben Zum zitierten Posting springen:
Was ich wissen möchte wie bekomme ich es hin, das immer nur gerade benötigten Palten angezeigt werden?
Ich würde AutoGenerateColumns auf false setzen, dann kannst du über die Columns-Eigenschaft die Spalten selbst festlegen.

user profile iconThommy0606 hat folgendes geschrieben Zum zitierten Posting springen:
2. Das zweite Problem ist, das meine Anwender gerne eine Summenzeile hätte, die die Summe der in den jeweiligen Spalten angezeiten Zahlen anzeigen soll.
Wenn du die Daten sowieso schon auf dem Client hast, würde ich dafür keine neue Anfrage abschicken, sondern direkt über die DataRows summieren.

_________________
>λ=
Thommy0606 Threadstarter
Hält's aus hier
Beiträge: 15

Win XP
C# (VS2008 Express)
BeitragVerfasst: Do 07.04.11 15:16 
Hallo Norman

C# 4.0 wäre dann Visual 2010 ????? :nixweiss:

Das mit den Wrapper müsstetst Du mir nochmal erklären, da meine Bücher bei Visual 2008 enden und den bestimmt nicht beschreiben. Oder geht das irgendwie mittels DataSet oder Datatable so das das berechne z.B. mit einer for oder foreach Schleife und wenn alles fertig ist Ausgabe ins DataGrid?? Wenn ja wäre ein kurzer Lösungsansatz recht hilfreich.

Vielen Dank für die bisher geleistete Hilfe und die Tips

gRU? tHOMAS
Thommy0606 Threadstarter
Hält's aus hier
Beiträge: 15

Win XP
C# (VS2008 Express)
BeitragVerfasst: Do 07.04.11 15:48 
Danke Sebastian

habe die DataRow Eigenschaft in meinen Buch gefunden und auch die Columns Eigenschaft werde das morgen gleich testen (habe nämlich Feierabendbei 20°C und Sonne).

Danke für Hilfe und noch eine schönen Tag

Gruß Thomas Ludwig
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Do 07.04.11 16:10 
@Kha

Habe das speziell mit einem Grid in Forms noch nicht probiert.
ausblenden 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:
        public class DynamicTable : DynamicObject
        {
            private DataTable datatable;


            public DynamicTable(DataTable datatable)
            {
                this.datatable = datatable;
            }

            public override bool TryGetMember(GetMemberBinder binder,
                out object result)
            {
                result = from DataRow itm in datatable.Rows
                         select itm[binder.Name];
                return true;
            }

            public override string ToString()
            {
                return datatable.TableName;
            }

            public override IEnumerable<string> GetDynamicMemberNames()
            {
                return from DataColumn itm in datatable.Columns select itm.ColumnName;
            }
        }


Das kann man jetzt beliebig mit Objekten füllen und erweitern, wie zum Beispiel einer Summenfunktion oder einer Namesbeschränkung. Funktioniert ähnlich wie ein anonymer Typ. Für WPF-Bindung ist sowas auf jeden Fall geeignet.

mfg
Thommy0606 Threadstarter
Hält's aus hier
Beiträge: 15

Win XP
C# (VS2008 Express)
BeitragVerfasst: Mo 11.04.11 13:19 
Hallo Norman und Sebastian

sorry das ich erst jetzt antworte!!

Das mit meiner Anzeige geht jezt aber anders als vorgeschlagen. Ich verwende als DataSource für das Datagridview anstatt eines DataSet eien DataTable die über ein DataView dem DataGridView zuweise und schon wird das View bei jeden wechsel aktualisiert und nur die abgefragten Spalten ein geblendet. Außerdem habe ich den ConnectionString in die Settings verbannt, damit er nicht mehr so Statisch ist. Siehe Code

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:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
    class Datenbank
    {
        public static string error = "";
        public static DataSet dsP91 = new DataSet();
        public static DataSet dsP92 = new DataSet();
        public static OleDbDataAdapter da = new OleDbDataAdapter();
        private static DataTable dt = null;
        public static DataView dv = null;

        private static string getConnectionstring()
        {
            OleDbConnectionStringBuilder csb = new OleDbConnectionStringBuilder();
            csb.ConnectionString = Properties.Settings.Default.DatabaseConnection;
            return csb.ConnectionString;
        }
       
        public static string Daten_Lesen (string sqlstr)
        {

            OleDbConnection conn = new OleDbConnection( getConnectionstring());
            da = new OleDbDataAdapter(sqlstr, conn);
            dt = new DataTable();

            //dt = new DataTable("Stück");
            //ds.Clear();

            try
            {
                conn.Open();
                //da.Fill(ds, "Stück");
                da.Fill(dt);
                conn.Close();
                dv = new DataView(dt);
                return error = "";
            }
            catch (Exception ex)
            {
                return error = ex.ToString();
            }
        }

        public static string Poren_91_Lesen(string sqlstr)
        {   

            OleDbConnection conn = new OleDbConnection(getConnectionstring());
            OleDbDataAdapter dap91 = new OleDbDataAdapter(sqlstr, conn);
            dsP91.Clear();

            try
            {
                conn.Open();
                dap91.Fill(dsP91, "Poren");
                conn.Close();
                return error = "Ready";
            }
            catch (Exception ex)
            {
                return error = ex.ToString();
            }
        }
    }
}


Wie ich die einstellungen ändere (bzw. der Anwender) muß ich noch nachlesen.

Die Sache mit der Summenzeile werde ich über DataRows realisieren bin aber noch nicht soweit (kommt aber diese Woche). über die Methode NewRow kann ich der DataTable ja die Summenzeile vor der anzeige hinzufügen. Sollt eigentlich so funktionieren. Werde das Ergebnis auf jedenfall reinstellen, damit andere das rad nicht unbeding neu erfinden müssen. :zwinker:

Auf jeden Fall noch mals vielen Dank für die Hilfe und die guten Hinweise!!! :D

Bis Später Thomas Ludwig!