Laden...

datagridview: wie bekomme ich den grauen bereich nach der letzten zeile weg?

Erstellt von Pennypecker vor 16 Jahren Letzter Beitrag vor 11 Jahren 4.853 Views
P
Pennypecker Themenstarter:in
50 Beiträge seit 2007
vor 16 Jahren
datagridview: wie bekomme ich den grauen bereich nach der letzten zeile weg?

hallo zusammen,

ich habe die tage eine dynamische liste erstellt, welches feste headerzeilen hat und darunter jeweils ein datagridview, welches automatisch gefüllt wird.
darunter jeweils wieder einen header + gatagridview innerhalb eines panels.
durch verschieben den panels nach unten erhalte ich somit eine schöne dynamische liste, die von der struktur her so aussieht:

texbox-header
datagridview-zeile1
datagridview-zeile2
datagridview-zeile3
textbox-header
datagridview-zeile1
datagridview-zeile2
datagridview-zeile3
usw....

an sich alles schön und gut.
die höhe des datagridviews ändere ich am ende noch auf datagridview.rowcount * 20
damit ich alle zeilen 20 px hoch habe.
auch wunderbar

problem ist jetzt nurnoch, dass ich am ende der datenzeilen immer noch eine zusätzliche "graue zeile" im datagridview habe.
sowas wie einen platzhalter.
habe ich scrollbalken drin, so kann ich eine zeile über die letzte hinausscrollen und sehe die "graue zeile"
entferne ich die scrollbalken (die ich ja nicht benötige) dann erscheint die "graue zeile" dann, wenn ich z.b. per pfeiltasten in die letzte zeile springe.
er scrollt also eine zeile nach oben, dh. die erste datenzeile verschwindet über den oberen rand hinaus und unten erscheint die graue zeile.

gibt es eine möglichkeit diese letzte platzhalter zeile zu entfernen?

vielen dank vorab schonmal

1.378 Beiträge seit 2006
vor 16 Jahren

Das ist die Hintergrundfarbe des DataGridViews welche du mit der Eigenschaft BackColor verändern kannst.

Wenn du nun den grauen Bereich verschwinden lassen willst, musst du nur dataGridView.BackColor=dataGridView.DefaultCellStyle.BackColor oder ähnliches schreiben.

Lg XXX

P
Pennypecker Themenstarter:in
50 Beiträge seit 2007
vor 16 Jahren

mh das war nicht ganz das was ich meinte, auf diese art mache ich den grauen bereich nur weiß

ich hätte die überflüssige zeile aber gerne komplett weg, sodass der user wirklich nur das sieht, was befüllte zeile sind.

5 datensätze sollen 5 sichtbare zeilen sein

derzeit sind 5 datensätze noch 5 zeilen + eine zeile darunter, die leer ist

danke trotzdem für die antwort 🙂

1.378 Beiträge seit 2006
vor 16 Jahren

Naja ich habe das so gelöst, indem ich mir ein eigenes DataGridView abgeleitet habe, und dort AutoSize implementiert habe. Die funktioniert so, dass sie die Anzahl der Zeilen*Zeilehöhe + ein bisschen was als höhe fürs DataGridView setzt.

Du kannst dies auch selbst nach programmieren, oder vielleicht findest du fertige Controls auf Code-Project die das bereits implementiert haben.

Lg XXX

J
3.331 Beiträge seit 2006
vor 16 Jahren

Hallo,

sehe ich das richtig, dass der Anwender keine neuen Zeilen hinzufügen soll? Hast Du probiert, ob die "Zusatzzeile" durch **AllowUserToAddRows **= false wegfällt?

Gruß Jürgen

P
Pennypecker Themenstarter:in
50 Beiträge seit 2007
vor 16 Jahren

jap, das siehst du richtig.
allerdings ist AllowUserToAddRows bereits auf false.

wenn ich AutoSize = false setze, da ich die größe ohnehin manuell anpasse, passiert leider auch nichts mit der überflüssigen zeile.

1.378 Beiträge seit 2006
vor 16 Jahren

Wenn du die Größe eh manuell setzt, wieso setzt du sie dann nicht so, dass sie den grauen Bereich wegscheidet? Das hatte ich nämlich mit einer eigenen AutoSize methode gemeint. Die Standard autoSize implementierugn macht nämlich nicht wirklich das, was man von ihr verlangt.

A
83 Beiträge seit 2007
vor 16 Jahren

Hallo Pennypecker,

ich habe dafür folgendes:


       public static int DGV_Hoehe(DataGridView dgv, int nRows)
        {

            int nHoehe = dgv.RowTemplate.Height * nRows + 3;

            if (dgv.ColumnHeadersVisible)
            {
                nHoehe += dgv.ColumnHeadersHeight + 4;
            }

            return nHoehe;

        }

eventuell kann man die 3 bzw. 4 auch noch ersetzen, ich denke, das sind die Pixel für den Rand des dgv.

ara

P
Pennypecker Themenstarter:in
50 Beiträge seit 2007
vor 16 Jahren

hihi
danke für die antworten, aber das geht alles am problem vorbei

ich versuche es nochmal zu erklären

die höhe passt zunächst, ich habe diese ja exakt zugeschnitten


public void FillTable(DataGridView dgv, Panel pan)
        {
            DataGridViewRow row = new DataGridViewRow();
            row.CreateCells(dgv);
            row.Cells[0].Value = "debug_termin";
            row.Cells[1].Value = "debug_tätigkeit";
            row.Cells[2].Value = "debug_ansprechpartner";
            row.Cells[3].Value = "debug_erledigt";
            row.Height = 20;
            dgv.Rows.Add(row);
            dgv.Height = dgv.RowCount * 20;
            pan.Location = new Point(pan.Location.X, dgv.Location.Y + dgv.Height);
        }

dann sieht meine form so aus:

bis hierhin alles super

ABER:

wenn ich dann in die unterste zeile der tabelle navigiere (ich klike in zeile 1 auf die 2. spalte und mit den pfeiltasten nach unten, dann sehe ich folgendes:

die tabelle wird eine zeile nach oben gescrollt, somit verschwindet zeile 1 über dem oberen ende der tabelle und unten taucht diese dumme graue zeile auf

die größe ist ja nachwievor dieselbe

scrolling ist deaktiviert, es sind ja auch keine balken da

mir würde nurnoch einfallen, dass ich die pfeiltasten deaktiviere im steuerelement, aber das muss doch anders gehen 🙁

P
Pennypecker Themenstarter:in
50 Beiträge seit 2007
vor 16 Jahren

sie ist immernoch da 🙁

A
83 Beiträge seit 2007
vor 16 Jahren

Hallo Pennypecker,

die Höhe für dein dgv ist etwas zu klein, weil die Ränder noch hinzukommen.
Gib mal der Höhe 10 Pixel mehr, dann müßte es gehen,

ara

1.378 Beiträge seit 2006
vor 16 Jahren

10 Pixel wird wohl etwas zu viel sein. Beim Click in die untere Zeile wird die Zeile ins Bild gescrollt, da sie anscheinend 1 oder 2 pixel darunter ist.

P
Pennypecker Themenstarter:in
50 Beiträge seit 2007
vor 16 Jahren

ich dreh ab... das wars X(

wegen 3 pixeln... aua

eigentlich so billig, aber ich glaub da wär ich erstma nich draufgekommen ^^

ich danke euch 👍

I
227 Beiträge seit 2009
vor 11 Jahren

Hallo xxxprod

da meine Frage unmittelbar mit dem Problem bzw. Deinem Lösungsvorschlag zu tun hat, schreibe ich mal hier.
Wie machst Du das genau mit der AutoSize-Implementierung? Wenn nun AutoSize true ist, reagierst Du dann auf jedes Event, das potentiell die Größe des DGV beeinflusst und berechnest dann die Größe neu oder geht das einfacher?

Grüße, Alex

Final no hay nada más

1.378 Beiträge seit 2006
vor 11 Jahren

Hallo Alex,

ja genau so hab ich das gemacht. Prinzipiell keine Hexerei:

Ich habe die Eigenschaft AutoSize überschrieben:


        bool _autoSize;
        public override bool AutoSize
        {
            get { return _autoSize; }
            set
            {
                _autoSize = value;
                RefreshControlSize();
            }
        }

und mich dann bei folgenden Events reingehängt um bei Änderungen ebenfalls die Größe neuzuberechnen:

OnColumnWidthChanged
OnRowHeightChanged

OnColumnAdded
OnRowsAdded

OnUserAddedRow
OnUserDeletedRow

OnDataSourceChanged
OnDataBindingComplete

Ich kann nicht mehr sagen warum ich zB die letzten zwei Events auch abboniert habe aber es war anscheinend notwendig - du kannst dich ja damit spielen.

Die Berechnung hab ich dann so gestaltet:


        private void RefreshControlSize()
        {
            if (!_autoSize) return;

            int height = 0;
            int width = 0;

            foreach (DataGridViewRow row in Rows)
                height += row.Height;

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

            if (ColumnHeadersVisible)
            {
                if (height == 0) height--;
                height += ColumnHeadersHeight;
            }
            if (RowHeadersVisible) width += RowHeadersWidth;

            if (BorderStyle == BorderStyle.FixedSingle)
            {
                width += 2;
                height += 2;
            }
            else if (BorderStyle == BorderStyle.Fixed3D)
            {
                width += 5;
                height += 5;
            }
            else
            {
                width += 1;
                height += 1;
            }

            Size = new Size(width, height);
        }

Lg, XXX

//Ein Edit muss noch dazu:

Das Property ist glaube ich im Designer nicht sichtbar. In dem Fall habe ich dann folgende Attribute noch angehängt:


        bool _autoSize;

        [Browsable(true),
         Description("Steuert, ob die Größe des DataGridViews automatisch angepasst werden soll."),
         Category("Verhalten")]
        public override bool AutoSize
        {
            get { return _autoSize; }
            set
            {
                _autoSize = value;
                RefreshControlSize();
            }
        }

I
227 Beiträge seit 2009
vor 11 Jahren

Vielen Dank.

Final no hay nada más