Autor Beitrag
lightsaver
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24


C# (VS 2008 Prof.)
BeitragVerfasst: Do 03.04.08 10:56 
Hi,

ich habe ein sehr seltsames Problem bei einem Projekt bezüglich des DataGridView (dgv).

Da man das dgv ja nicht ordentlich (sozusagen pixelgenau) scrollen kann und es auch Probleme gibt, wenn eine Zeile größer (von der Höhe) ist, als das dgv, habe ich das dgv in ein Panel integriert. Da ich nun hiermit das scrollen übernehme, habe ich beim dgv die scrollbar deaktiviert. Um nun das ganze dgv sehen zu können, muss ich nun die Höhe aller Zeilen ermitteln und das dgv entsprechend in der Höhe anpassen. Ein einfaches Zeilenzählen funktioniert nicht, da ich teilweise recht lange Texte speichere. Ach ja, das dgv wird mit AutoSizeRow = AllCellsExeptHeader initialisiert, sollte also die Zeilenhöhe automatisch anpassen.

gut, soviel erstmal zu dem Hintergrund, nun zum Problem:

ich habe eine Funktion geschrieben, die meine Daten in das dgv hinzufügt und dann die neue Höhe berechnet

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
public void addNewPosData(string[] data, DataGridView dgv)
        {
            dgv.Rows.Add(data);
            dgv.Refresh();
            setGridHeight(dgv);
            dgv.ClearSelection();
        }

internal void setGridHeight(DataGridView dgv)
        {
            int rc = dgv.RowCount;
            int hei = dgv.ColumnHeadersHeight;
            for (int i = 0; i < rc; i++)
            {
                hei += dgv.Rows[i].Height;
            }
            
            dgv.Height = hei;
        }


Wenn ich Daten aus einer Eingabemaske übernehme und dann addNewPosData ausführe, dann funktioniert das ganze wunderbar. Die Daten werden dann später im Programmablauf in die Datenbank geschrieben. Wenn ich nun die Daten aus der Datenbank auslese und dann wieder in dem dgv anzeigen lassen möchte, kommt es aber zu meinem Problem.
Die Daten werden zwar korrekt hinzugefügt, die Zeilenhöhe wird aber nicht aktuallisiert. Es wird mir für jede Zeile die Defaulteinstellung aus DefaultRow zurückgegeben, was natürlich nicht stimmt.
Da ich aber die selbe Funktion wie vorher benutze ist das ganze schon etwas merkwürdig. Es wird aber noch seltsamer:

Ich habe den ganzen Programmablauf natürlich im Debugger verfolgt. Dabei konnte ich auch sehen, dass die Zeilenhöhe immer bei 22 bleibt, egal ob ich ein dgv.refresh() oder ein dgv.autoresizerows() aufrufe. Sehe ich mir mit dem Debugger aber das dgv-objekt an, dann wird direkt (also ohne aufruf von refresh oder autoresizerows) der wert korrekt angezeigt und die Anzeige dann später im GUI stimmt wieder.

So, mal abgesehen davon, dass hier möglicherweise ein Bug in .NET vorliegen könnte, hat irgendjemand eine Idee, wie ich das ganze umgehen könnte?


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Do 03.04.2008 um 11:05