Avatar billede r.hegaard Nybegynder
19. december 2006 - 19:09 Der er 9 kommentarer og
1 løsning

Problemer med afmarkering af celler i DataGridView

Jeg har et DataGridView, hvor jeg gerne vil disable alle former for markering.
Mit første håb var, at det kunne gøres gennem SelectionMode, men der kan man desværre ikke. Jeg har derfor lavet, så jeg kalder ClearSelection() ved SelectionChanged. Det virker også umiddelbart fint, men ind i mellem kommer der en lille stiplet ramme rundt om den celle, som der sidst er klikket på. Jeg har ikket kunnet gennemskue, hvornår den stiplede ramme dukker op.
Hvad kan jeg gøre, for at man slet ikke kan markere noget i mit DataGridView??
Avatar billede bulgroz Nybegynder
19. december 2006 - 22:26 #1
Din grid anvender en DefaultCellStyle som du kan ændre

DefaultCellStyle har en property SelectionBackColor, som du kan sætte til samme værdi som BackColor.

SelectionForeColor sættes tilsvarende til samme værdi som ForeColor.

Bemærk at der er tilsvarende default cell style for Row, Column og Cell.

Hvis du derudover ønsker at skjule FocusRectangle kan du sætte Gridden, Kolonnen eller Cellen til ReadOnly.

Hvis dette ikke kan accepteres må du igang med at lave din egen celletype, hvor du selv står for tegningen.
Avatar billede r.hegaard Nybegynder
19. december 2006 - 22:35 #2
Tak for svaret.

Jeg har sat hele Grid'et til ReadOnly, men den stiplede fokus ramme kommer stadig ind i mellem. Den er der aldrig, når programmet starter op og når man så har brugt programmet lidt tid, så er den der pludseligt. Jeg har endnu ikke fundet ud af, hvad det er, som får den til at komme frem.
Avatar billede bulgroz Nybegynder
20. december 2006 - 07:41 #3
I mit eksempel har jeg sat de enkelte kolonner ReadOnly, og det virker fint.

Nb. Du kan ikke skjule selection helt fra RowHeaderen, men du kan vælge at skjule den helt, og derefter lave din som en almindelig celle.
Avatar billede r.hegaard Nybegynder
20. december 2006 - 21:38 #4
Jeg har lige været ved at teste lidt mere og prøvet nogle forskellige ting. Men jeg kan ikke få den lille stiplede ramme til at forsvinde.

Jeg har nu prøvet at sætte både Grid'en, alle rækker og alle kolonner til ReadOnly.
Jeg har skjult RowHeaderen og sat SelectionMode til FullRowSelect.
Når jeg klikker på nogle celler, så sker der ingenting. Hvis jeg så trykker tabulator, så kommer det lille stiplede ramme frem.
Kan du genskabe fejlen?
Jeg ved ikke, om det kan være en fejl i DataGridView'et.
Avatar billede bulgroz Nybegynder
20. december 2006 - 22:04 #5
Den (FocusRectangle) slipper du nok ikke af med, da den er en væsentlig del af "brugeroplevelsen" i en grid. Farverne for FocusRectangle kommer ved at invertere kombinationen af farver i cellen, og det vil derfor ikke være muligt at skjule den helt.

For at fjerne den helt må du lave dig egen celle, hvor du undlader at tegne FocusRectangle.
Avatar billede bulgroz Nybegynder
20. december 2006 - 22:16 #6
Halløjsa, der er liv efter døden ;-) Jeg fandt en løsning (eller rettere 2)
Jeg har brygget et lille eksempel til dig.

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.dataGridView1.RowCount = 10; // Demodata...

            // Løsning 1 (På celle niveau)
            this.dataGridView1.CellPainting += new DataGridViewCellPaintingEventHandler(dataGridView1_CellPainting);

            // Løsning 2 (På row niveau)
            this.dataGridView1.RowPrePaint += new DataGridViewRowPrePaintEventHandler(dataGridView1_RowPrePaint);

            // NB. Du skal naturligvis kun anvende den ene løsning.
        }

        void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            e.Paint(e.ClipBounds, DataGridViewPaintParts.All & ~DataGridViewPaintParts.Focus);
            e.Handled = true;
        }

        void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            e.PaintParts = DataGridViewPaintParts.All & ~DataGridViewPaintParts.Focus;

        }
    }
Avatar billede r.hegaard Nybegynder
21. december 2006 - 08:14 #7
Tak, det virker perfekt. Lægger du lige et svar?
Avatar billede bulgroz Nybegynder
21. december 2006 - 08:24 #8
Samme fremgangsmåde kan også skjule selection!

Prøv nedenstående rettede eksempel:


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.dataGridView1.RowCount = 10; // Demodata...

            // Hide Selection
            this.dataGridView1.RowPrePaint += new DataGridViewRowPrePaintEventHandler(this.OnDataGridView1RowPrePaint);
        }

        void OnDataGridView1RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            DataGridViewPaintParts paintParts = DataGridViewPaintParts.All;
            paintParts = paintParts & ~DataGridViewPaintParts.Focus; // Skjuler focus rectangle
            paintParts = paintParts & ~DataGridViewPaintParts.SelectionBackground; // Skjuler Selection

            e.PaintParts = paintParts;
        }
    }
Avatar billede r.hegaard Nybegynder
21. december 2006 - 08:44 #9
Tak. Jeg har allerede tilføjet "& ~DataGridViewPaintParts.SelectionBackground", dog var jeg nød til først at sige "DefaultCellStyle.SelectionForeColor = DefaultCellStyle.ForeColor", da teksten ellers forsvandt.
Avatar billede bulgroz Nybegynder
21. december 2006 - 09:09 #10
Naturligvis. Det slipper du ikke for.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester