Announcement

Collapse
No announcement yet.

nicht sichtbares DataGridView bleibt leer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • nicht sichtbares DataGridView bleibt leer

    Hallo zusammen,

    ich habe ein DataGridView, welches ich so

    frm.dataGridView1.DataSource = meineDataTable;

    an eine DataTable binde. Das klappt auch.

    Wenn ich das DataGridView allerdings nicht auf ein Formular platziere, sondern nur im Code anlege, dann bleibt es leer?

    So sieht der Code aus:
    DataGridView dgv = new DataGridView();
    dgv.DataSource=meineDataTable;

    Hat jemand eine Idde?
    micha

  • #2
    Wofür soll ein nicht sichtbares Control gut sein?

    Comment


    • #3
      hi,

      ich nutze dies aktuell eigentlich nur als Hilfsmittel.
      Ich muss pro Spalte das Minimum und Maximum ermitteln.
      Beim DataGridView kann ich sehr leicht durch gehen. (Je eine foreach-Schleife für Spalte und Zeile)

      Bei der DataTable habe ich das Problem, dass ich bei dieser immer nur Zeilenweise an die Daten komme.
      Ich muss aber die Min/Max-Werte der jeweiligen Spalte zuweisen.

      LINQ kann ich nicht nutzen, da ich in .NET 2.0 arbeite.

      micha

      Comment


      • #4


        [Highlight=C#]foreach (DataRow row in meinLiebeDatatable.Rows)
        {
        foreach (object cell in row.ItemArray)
        {
        // mach irgendwas mit jeder Zelle
        }
        }[/Highlight]

        Comment


        • #5
          Ich habe gerade kein C# zur Hand, aber geht das nicht etwa so auch:
          Code:
          DataTable tbl = new DataTable();
          foreach (DataRow row in tbl.Rows)
          {
            foreach (DataColumn col in tbl.Columns)
            { object cellData = row[col]; }
            // oder
            foreach (var item in row.ItemArray)
            { ... }
          }
          bye,
          Helmut

          Comment


          • #6
            zur not kann man auch eine List <string, string> verwenden und die durch gehen,
            jedoch habe ich das problem nicht ganz verstanden.

            kannst du das vllt genauer beschreiben, wenn dir die bisherigen antworten noch nicht geholfen haben?

            Comment


            • #7
              Code:
              List <string, string>
              Du wolltest vermutlich eine andere (existierende) Datenstruktur empfehlen

              Comment


              • #8
                Hallo zusammen,

                so habe ich das aktuell gelöst:

                Code:
                 foreach (DataGridViewColumn column in frm.dataGridView1.Columns)
                                {
                                    double min = 0;
                                    double max = 0;
                
                                    if (column.Name != "Time")
                                    {
                                        foreach (DataGridViewRow row in frm.dataGridView1.Rows)
                                        {
                                            if (frm.dataGridView1[column.Name, row.Index].Value != null && frm.dataGridView1[column.Name, row.Index].Value.ToString() != "")
                                            {
                                                if (Convert.ToDouble(frm.dataGridView1_Min[column.Name, row.Index].Value) >= max)
                                                {
                                                    max = Math.Round(Convert.ToDouble(frm.dataGridView1[column.Name, row.Index].Value), 2);
                
                                                }
                
                                                if (Convert.ToDouble(frm.dataGridView1[column.Name, row.Index].Value) <= min)
                                                {
                                                    min = Math.Round(Convert.ToDouble(frm.dataGridView1[column.Name, row.Index].Value), 2);
                
                                                }
                                            }
                                        }
                                    }
                                    maxValuesDictionary.Add(column.Name, max.ToString());
                                    minValuesDictionary.Add(column.Name, min.ToString());
                                }
                klappt prima. Bei der DataTable liegen die Daten immer zeilenweise vor, so dass ich da momentan auf dem Schlauch stehe, wie ich die min/max pro Spalte ermitteln kann und diese auch ins Dictionary schreiben kann, bei dem die Spalte der Key ist.

                micha

                Comment


                • #9
                  Bitte mach das nicht. Du kannst doch z.B. wie oben beschrieben einfach auch die Zeilen der DataTable durchlaufen und genau das gleiche dort machen.
                  Der View sollte stehts nur eine Anzeige deiner berechneten Daten sein. Logik sollte nicht mit UI Komponenten realisiert werden.

                  Comment


                  • #10
                    Hallo,

                    vielen Dank für Eure Antworten. Ich weiß nicht warum, aber irgendwie stand auf dem Schlauch und hab die Lösung nicht gesehen

                    Ich habs nun so umgesetzt:
                    Code:
                                     foreach (DataColumn col in e.DataTable.Columns)
                                        {
                                          foreach (DataRow row in e.DataTable.Rows)
                                             {
                                               //min/max ermitteln
                                              }
                                        }
                    Klappt nun prima ohne Datagridview

                    Comment


                    • #11
                      das ist auf jeden Fall viel besser als die Lösung mit dem DGV

                      Comment


                      • #12
                        Hi,

                        die Lösung gefällt mir auch besser. Ist denke ich auch performanter, als er das DataGrid zu füllen und diese dann zu durchlaufen.
                        Die DataTable besteht aus 34Spalten mit ca 20.000 Zeilen. Das Ermitteln der min/max dauert doch einiges an Zeit. Ein paar Sekündchen sind es schon.
                        Siehst Du eine Möglichkeit, das etwas zu optimieren, was die Performance angeht, also die Zeit für die Ermittlung zu verkürzen.

                        micha

                        Comment


                        • #13
                          Kommen die Daten aus einer DB? Wenn ja kann man eine Datenbankabfrage schreiben, die Dir exakt diese Werte berechnet. Das ist mit Sicherheit performanter da dann nicht die kompletten Daten übers Netz geschaufelt werden müssen. Das ist ja meist der Bottleneck bei solchen Geschichten.

                          Comment


                          • #14
                            Das was bei dir wahrscheinlich so lange dauert, ist die tatsache, dass du bei jeder verwendung eines wertes neu convertierst.

                            hier habe ich dir ein bsp geschrieben, wie du schnell und einfach auslesen kannst.

                            Block 1: füllt mir nur schnell die tabelle
                            Block 2: dies ist das eigentliche auslese-script

                            Code:
                                        DataTable table;
                            
                            // Block 1 >>>>>
                                        table = new DataTable();
                                        table.Columns.Add("Spalte 1");
                                        table.Columns.Add("Spalte 2");
                                        table.Columns.Add("Spalte 3");
                            
                                        for (int i = 0; i <= 10; i++)
                                        {
                                            DataRow newRow = table.NewRow();
                            
                                            newRow[0] = i * 1;
                                            newRow[1] = i * 2;
                                            newRow[2] = i * 3;
                            
                                            table.Rows.Add(newRow);
                                        }
                            
                            // Block 2 >>>>>
                            
                                        // For each row, print the values of each column.
                                        foreach (DataRow row in table.Rows)
                                        {
                                            double min = double.MaxValue;
                                            double max = double.MinValue;
                            
                                            foreach (DataColumn column in table.Columns)
                                            {
                                                double d = Convert.ToDouble(row[column]);
                                                    
                                                if (d < min)
                                                    min = d;
                                                if (d > max)
                                                    max = d;
                                            }
                            
                                            minValuesDictionary.Add(column.Name, Math.Round(Math.Abs(min)).ToString());
                                            maxValuesDictionary.Add(column.Name, Math.Round(Math.Abs(max)).ToString());
                                        }
                            Zuletzt editiert von Nooa; 29.09.2011, 02:01.

                            Comment

                            Working...
                            X