DataGridView Row hinzufügen



  • Hallo,

    ich benutze in meinem Programm ein DataGridView. Während der Laufzeit werden automatisch neue Reihen ins DGV eingefügt. Dieses erfolgt mittels der add-Funktion.
    Das klappt alles wunderbar, solange der sichtbare Bereich des DGVs noch nicht vollständig gefüllt ist. Wenn dieser aber voll ist, dann sollte am Rand ein Scrollbar erscheinen (mittels Anweisung DGV->ScrollBars = ScrollBars::Both;). Dieses passiert leider nicht immer und das Programm friert ein. Wenn dann doch eine Scrollbar erscheint friert das Programm dennoch ein.
    Interessant dabei ist, das wenn ich vor dem Auffüllen mit neuen Daten das DGV so klein mache, das von Anfang an ein Scrollbar da ist, dann läuft alles Bestens...
    Kennt irgendjemand eine Abhilfe???



  • Ja:

    Code Posten =o) Ich habe trotz massigen GridView einsatz ein solches Verhalten nicht feststellen können.



  • Habe das Problem mittlerweile umgangen, in dem ich vor dem Einfügen abfrage, ob der ScrollBar im Einsatz ist, wenn Nein, dann verkleiner ich vor dem Einfügen das Fenster (ein ScrollBar erscheint) und wenn alles eingefügt ist, wird es wieder auf die Ursprungsgröße zurückgesetzt. So funktioniert alles Bestens, dennoch müsste es dafür auch bessere Lösungen geben, daher nun die für dieses Problem wichtigsten Codezeilen:

    DataGridViewCellStyle^ dataGridViewCellStyle1 = gcnew DataGridViewCellStyle();
    
    	this->dataGridView1 = gcnew DataGridView();
    	this->Col_Zyklus = gcnew DataGridViewTextBoxColumn();
    	this->Col_Zeit = gcnew DataGridViewTextBoxColumn();
             //und 27 weitere Spalten...
    
    	(cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->dataGridView1))->BeginInit();
    	this->SuspendLayout();
    
    	//dataGridViewCellStyle1
    	dataGridViewCellStyle1->Alignment = DataGridViewContentAlignment::MiddleLeft;
    	dataGridViewCellStyle1->BackColor = SystemColors::Window;
    	dataGridViewCellStyle1->Font = (gcnew System::Drawing::Font(L"Courier New", 8.25F, FontStyle::Regular, 
    		GraphicsUnit::Point, static_cast<System::Byte>(0)));
    	dataGridViewCellStyle1->ForeColor = SystemColors::ControlText;
    	dataGridViewCellStyle1->SelectionBackColor = Color::Silver;
    	dataGridViewCellStyle1->SelectionForeColor = SystemColors::ControlText;
    
    	//dataGridView1
    	this->dataGridView1->AllowUserToAddRows = false;
    	this->dataGridView1->AllowUserToDeleteRows = false;
    	this->dataGridView1->AllowUserToResizeRows = false;
    	this->dataGridView1->AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode::Fill;
    	this->dataGridView1->AutoSizeRowsMode = DataGridViewAutoSizeRowsMode::None;//:AllCells;
    	this->dataGridView1->BackgroundColor = SystemColors::ControlLightLight;
    	this->dataGridView1->CellBorderStyle = DataGridViewCellBorderStyle::None;
    	this->dataGridView1->ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode::AutoSize;
    	this->dataGridView1->Columns->AddRange(gcnew array<DataGridViewColumn^>(29) {this->Col_Zyklus,
        //und die restleichen Spalten einfügen		
        });
    	this->dataGridView1->CheckForIllegalCrossThreadCalls::set(false);
    	this->dataGridView1->DefaultCellStyle = dataGridViewCellStyle1;
    	this->dataGridView1->Dock = DockStyle::Fill;
    	this->dataGridView1->MultiSelect = false;
    	this->dataGridView1->Name = L"dataGridView1";
    	this->dataGridView1->ReadOnly = true;
    	this->dataGridView1->RowHeadersVisible = false;
    	this->dataGridView1->ScrollBars = ScrollBars::Both;
    	this->dataGridView1->SelectionMode = DataGridViewSelectionMode::FullRowSelect;
    	this->dataGridView1->TabIndex = 0;
    	this->dataGridView1->CellClick += gcnew DataGridViewCellEventHandler(this, &DatenMonitor::CellButtonClicked);
    	this->dataGridView1->ColumnHeaderMouseClick += gcnew DataGridViewCellMouseEventHandler(this, &DatenMonitor::ColumnHeaderClicked);
    
        //....
    
        //Das Fenster im dem sich das DGV befindet
    	this->AutoScaleDimensions = SizeF(6, 13);
    	this->AutoScaleMode = Windows::Forms::AutoScaleMode::None;
    	this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::Sizable;
    	this->ClientSize = Drawing::Size(832, 501);
    	this->Controls->Add(this->dataGridView1);
    	this->Name = L"DatenMonitor";
    	this->Text = L"DatenMonitor";
    	this->FormClosing += gcnew FormClosingEventHandler(this, &DatenMonitor::DatenMonitor_CloseForm);
    	(cli::safe_cast<ISupportInitialize^>(this->dataGridView1))->EndInit();
    	this->ResumeLayout(false);
    

    Hier noch der Aufruf zum Füllen des DGVs:

    array<Object^>^ aoDGVElemente = gcnew array<Object^>(29);
    
    	//Das Array mit Werten füllen...
    
    	this->dataGridView1->Rows->Add(aoDGVElemente);
    

    Alternativ zu dem Array habe ich auch versucht DataGridViewRow-Objekte einzufügen, das Ergebnis war aber identisch.

    Noch ein kleiner Zusatz mit einer etwas genaueren Problembeschreibung:
    In dem DGV ist es auch möglich bestimmte Zellen anzuklicken, diese bewirken ein Vergrößern der jeweiligen Reihenhöhe. Sollte bei so einer Aktion ein Scrollbar erforderlich sein, so erscheint er prompt und die Funktion wird ordnungsgemäß durchgeführt.
    Das Problem mit dem Einfrieren geschieht wirklich nur beim Hinzufügen von neuen Reihen. Dabei erscheint zwar meistens ein ScrollBar, dieser ist in seiner Darstellung aber unvollständig (kleine Lücken am oberen und unteren Rand). Wenn man nun auf das Fenster klickt, kommt es zum Einfrieren.



  • Das DGV ist ungebunden ?

    Werde mal versuchen das nach zu vollziehen, mal schauen ob sich was findet.



  • Ja, das DGV ist ungebunden.
    Noch ein Zusatz, es werden nicht alle Spalten angezeigt (visible::set(false), auch wenn ich nicht glaube, dass das ein möglicher Grund für das Problem ist.



  • Hier mal ne DGV zum spielen:

    www.rothmichael.de/cpp/DGV.zip


Anmelden zum Antworten