Laden...

DataGridView: Verschwundene Scrollbar beim selber Zeichnen

Erstellt von Fabian vor 16 Jahren Letzter Beitrag vor 16 Jahren 765 Views
Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 16 Jahren
DataGridView: Verschwundene Scrollbar beim selber Zeichnen

Hallo zusammen,

wie auf dem Bild (enthält zwei Screenshots) im Anhang zu sehen ist, habe ich ein DataGridView, bei dem ich den Inhalt der Zeilen selber zeichne (zumindest bei einigen). Wie man im oberen Screenshot sehen kann, ist die vertikale Scrollbar nicht zu sehen, obwohl es mehr Zeilen gibt, als angezeigt werden können.

Wenn ich jetzt irgendeine Spalte resize, und sei es nur um einen Pixel (egal welche Spalte, egal ob größer oder kleiner), dann wird die Scrollbar angezeigt (unterer Screenshot). Warum die Scrollbar nicht zu Beginn gezeichnet wird, ist mir aber noch ein Rätsel.

Hat jemand eine Erklärung dafür?

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

915 Beiträge seit 2006
vor 16 Jahren

Hrm, kannst du den Abschnitt reinposten an denen du die OnRowPostPaint / OnRowPrePaint Methoden überschreibst um die Zeilen selbst zu zeichnen? Denn, normalerweise wenn diese überschreibst sollte die Scroulbar nicht beeinflusst werden. Oder überschreibst du die OnPaint Methode?

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

Fabian Themenstarter:in
1.985 Beiträge seit 2004
vor 16 Jahren

Hallo Andreas.May,

entschuldige die späte Antwort, aber ich komme irgendwie erst jetzt dazu. Hier mal die entsprechenden Ausschnitte:

private Rectangle rowBoundsRectangle = new Rectangle();

private void verifiedUpdaterSettingsDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
    if (e.RowIndex < 0 || e.ColumnIndex == -1) {
        return;
    } else if (!Convert.ToBoolean(this.verifiedUpdaterSettingsDataGridView.Rows[e.RowIndex].Cells["columnVerifiedUpdaterSettingsIsSetting"].Value)) {
        e.PaintBackground(e.ClipBounds, true);
        e.Handled = true;
    }
}

private int GetColumnWidth() {
    int width = 0;

    foreach (DataGridViewColumn currentColumn in this.verifiedUpdaterSettingsDataGridView.Columns) {
        if (currentColumn.Visible)
            width += currentColumn.Width;
    }

    return width;
}

private void verifiedUpdaterSettingsDataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) {
    if (!Convert.ToBoolean(this.verifiedUpdaterSettingsDataGridView.Rows[e.RowIndex].Cells["columnVerifiedUpdaterSettingsIsSetting"].Value)) {
        if (!String.IsNullOrEmpty(this.verifiedUpdaterSettingsDataGridView.Rows[e.RowIndex].Cells["columnVerifiedUpdaterSettingsSettingName"].Value.ToString())) {
            this.rowBoundsRectangle.X = e.RowBounds.Left;
            this.rowBoundsRectangle.Y = e.RowBounds.Top;
            this.rowBoundsRectangle.Width = this.GetColumnWidth();
            this.rowBoundsRectangle.Height = e.RowBounds.Height - 2;

            e.Graphics.DrawRectangle(Pens.White, this.rowBoundsRectangle);
            e.Graphics.FillRectangle(Brushes.White, this.rowBoundsRectangle);

            e.Graphics.DrawString(this.verifiedUpdaterSettingsDataGridView.Rows[e.RowIndex].Cells["columnVerifiedUpdaterSettingsSettingName"].Value.ToString(),
                new Font("Arial", 10, FontStyle.Bold), Brushes.Black,
                this.rowBoundsRectangle.X + 5 - this.verifiedUpdaterSettingsDataGridView.HorizontalScrollingOffset,
                this.rowBoundsRectangle.Y - 6, StringFormat.GenericDefault);

            e.Graphics.DrawImage(global::IKAROSsqlUpdater.GUI.Properties.Resources.CategoryLine,
                this.rowBoundsRectangle.X + 5, this.rowBoundsRectangle.Y + 7);
        } else {
            this.rowBoundsRectangle.X = e.RowBounds.Left;
            this.rowBoundsRectangle.Y = e.RowBounds.Top;
            this.rowBoundsRectangle.Width = this.GetColumnWidth();
            this.rowBoundsRectangle.Height = e.RowBounds.Height;

            e.Graphics.DrawRectangle(Pens.White, this.rowBoundsRectangle);
            e.Graphics.FillRectangle(Brushes.White, this.rowBoundsRectangle);


        }
    }
}

private void verifiedUpdaterSettingsDataGridView_Scroll(object sender, ScrollEventArgs e) {
    this.verifiedUpdaterSettingsDataGridView.Invalidate();
}

Ist leider etwas mehr 😦. Ich hoffe, Du kannst trotzdem etwas damit anfangen.

Gruß,
Fabian

"Eine wirklich gute Idee erkennt man daran, dass ihre Verwirklichung von vornherein ausgeschlossen erscheint." (Albert Einstein)

Gefangen im magischen Viereck zwischen studieren, schreiben, lehren und Ideen umsetzen…

Blog: www.fabiandeitelhoff.de

915 Beiträge seit 2006
vor 16 Jahren

Hrm, sehe leider den dafür verantwortlichen Fehler nicht. Habe mal versucht das ganze ca. wie deine Screenshoots nachzubilden und klappte eigentlich ganz gut.

Die größen breiten der Spalten und der Zellen sind quasi egal, die Standardscrolleisten werden normal über Control Add hinzugefügt und besitzen daher ihre eigene verarbeitung der WindowsNachrichten. Daher, selbst wenn die OnPaint Methode überschreibst und base.Paint ausklammern würdest. Würden die Scroulleisten dennoch korrekt dargestellt werden.

Tut mir leid sehe leider den Fehler nicht, fügst du evtl. deine eigene Scrolbar an oder hantierst mit denen speziell herum (Denke aber mal, wirst nur für das Invalidate nen Methodenaufruf haben) ?

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(