Avatar billede pablopablo Nybegynder
22. januar 2005 - 04:59 Der er 6 kommentarer og
1 løsning

Hjælp til override Paint metode

Hejsa...

Jeg er ved at gøre således, så div. celler i mit datagrid bliver farve alt efter hvilken værdi de indeholder..det er dog KUN den tredie kolonne hvis celler som evt. skal farves....HVER celle's indhold sammenlignes med med en bestemt værdi fra gui'en af...( nogle textboxe i formen)...(derfor modtager min UcerControl en MicrosForm ref...)

Jeg kan godt få det til at virke, hvis jeg laver et SIMPELT tjek for ALLE cellerne i datagriddet. Fx. hvis deres værdi er højere end 5, så skal baggrunden i cellen farves rød - ellers hvid...men når jeg laver det lidt mere advanceret, så farver den ikke længere cellerne korrekt...har prøvet er debugge, og der ser det ud til at den gøre det rigtige...Men når formen så kører, er det hele alligevel farvet hvidt...?

Jeg kan få fat i række nummeret på den aktuelle celle som bliver tegnet i mit datagrid...men jeg ved ikke hvordan jeg får fat i den aktuelle kolonne? Lige nu itererer jeg igennem kolonner på min egen alternative måde og det er åbenbart det som af en eller anden grund ikke virker korrekt...? Ved i hvordan jeg får fat i den aktuelle kolonne, eller koordinatet på den aktuelle celle, som bliver tegnet, ville selvfølgelig være lige så godt :)

Min UserControl ser således ud....

public class DataGridColumColor : DataGridTextBoxColumn
{
    MicrosForm mf1;

    public DataGridColumColor(PropertyDescriptor pcol, MicrosForm mf)
    {
        mf1=mf;
    }
   
    protected override void Paint(Graphics g,Rectangle Bounds,CurrencyManager Source,int RowNum, Brush BackBrush ,Brush ForeBrush ,bool AlignToRight)
    {
        string tekst = "";
        double værdi = 0;
        bool farvelægCelle = false;       

        if(RowNum==2)
        {
            for(int i=0; i<5; i++)
            {
                farvelægCelle = false;
                tekst = mf1.udDataGridReproducerbarCvSdMv[2,i].ToString();
                værdi = Double.Parse(tekst.Replace(".",","));

                if(i==0)
                {
                    if(værdi>Double.Parse(mf1.textBoxIndstillingerReproCRP.Text))
                        farvelægCelle = true;
                }

                else if(i==1)
                {
                    if(værdi>Double.Parse(mf1.textBoxIndstillingerReproGRAa.Text))
                        farvelægCelle = true;
                }

                else if(i==2)
                {
                    if(værdi>Double.Parse(mf1.textBoxIndstillingerReproGRAp.Text))
                        farvelægCelle = true;
                }

                else if(i==3)
                {
                    if(værdi>Double.Parse(mf1.textBoxIndstillingerReproHGB.Text))
                        farvelægCelle = true;
                }

                else //if(i==4)
                {
                    if(værdi>Double.Parse(mf1.textBoxIndstillingerReproHCT.Text))
                        farvelægCelle = true;
                }

                //Teksten i den aktuelle celle
                string cellVærdi = GetColumnValueAtRow(Source, RowNum).ToString();
                       
                if(farvelægCelle)
                {
                    //Sætter bagggrundsfaven
                    BackBrush = Brushes.Red;
                }
                else
                    BackBrush = Brushes.White;

                //Farver cellen
                g.FillRectangle(BackBrush, Bounds.X, Bounds.Y, Bounds.Width, Bounds.Height);

                //Opretter en font
                System.Drawing.Font font = new Font("Arial", (float)8.25 );

                //Tegner teksten på overpå igen :)
                g.DrawString(cellVærdi,font ,Brushes.Black ,Bounds.X ,Bounds.Y );
            }
        }
        else
        {
            //Teksten i den aktuelle celle
            string cellVærdi = GetColumnValueAtRow(Source, RowNum).ToString();
                       
            BackBrush = Brushes.White;

            //Farver cellen
            g.FillRectangle(BackBrush, Bounds.X, Bounds.Y, Bounds.Width, Bounds.Height);

            //Opretter en font
            System.Drawing.Font font = new Font("Arial", (float)8.25 );

            //Tegner teksten på overpå igen :)
            g.DrawString(cellVærdi,font ,Brushes.Black ,Bounds.X ,Bounds.Y );
        }
    }
}

Håber meget på i kan hjælpe mig!!

Mvh. PabloPablo
Avatar billede lifo Nybegynder
22. januar 2005 - 05:54 #1
tror ikke at du kan gøre det på den måde
eller det fungerer måske om du laver en klasse til hver kolonne

du bliver nok nødt til at bruge metode 3 på denne side
http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#q745q
Avatar billede pablopablo Nybegynder
22. januar 2005 - 11:29 #2
hhm...det undrer mig at man ikke kan...btw...dit link virker ikke? men jeg har tilgengæld selv fundet det tror jeg...www.syncfusion.com/faq/winforms/search/745.asp+DataGridColoredTextBoxColumn++c%23&hl=da" target="_blank">http://www.google.dk/search?q=cache:8NGoU5KVycYJ:www.syncfusion.com/faq/winforms/search/745.asp+DataGridColoredTextBoxColumn++c%23&hl=da
Avatar billede wisen Nybegynder
22. januar 2005 - 12:02 #3
Jeg kan ikke lige gennemskue dit kode - for mig ser det ud til at du tegner værdien ud fem gange i række 2 ?!? men dit problem er at du ikke ved hvilken kolonne du står i - du har ikke problemer med at få tegnet?
Avatar billede pablopablo Nybegynder
22. januar 2005 - 18:28 #4
hhm...ja , det kan egentlig godt være...? men min ide, var at iterere igennem de eksisterende kolonner via for-løkken...men ja, det er nok forkert...
Altså koden som farver cellerne virker fint, men "algoritmen" som afgør hvilke celler som bliver farvet i dette eks...fungerer ikke så godt i dette eks...tog udgangpunkt i dette eks. : http://www.codeproject.com/csharp/custom_datagridcolumnstyl.asp men det er åbenbart ikke godt nok at bruge i dette tilfælde...bliver nok nød til at bruge metoden i det link jeg postede..som benytter events....der har de fat i den aktuelle celle...:)
Avatar billede wisen Nybegynder
22. januar 2005 - 19:48 #5
... men hvad er dit problem?

bortset fra nogle skønhedsfejl burde din kode da virke - men du kan ikke afgøre hvilken kolonne du er ved at tegne eller hvad?
Avatar billede pablopablo Nybegynder
22. januar 2005 - 21:54 #6
mit problem er : ja, at jeg ikke ved hvilken kolonne jeg har fat i og grunden til at jeg vil have fat i den er, at jeg allerede kan få fat i rækken og dermed ville jeg til sidst kunne få fat i den aktuelle celle, som skal farves eller ej...lige nu farves hele rækken nemlig helt eller slet ikke...det virker lidt som  om det er periodisk...lidt som om den farve paint metoden "ender på", bliver den farve som bliver synlig...?-/
Avatar billede pablopablo Nybegynder
23. januar 2005 - 09:14 #7
Hejsa, vil blot lige sige, at jeg lige har fået lavet mit datagrid færdigt ;) Det med at hægte en eventHandler op på hver datagrid kolonne, er bare skide smart! Det giver uanede muligheder og det virker! :) Har fået farvet cellerne i mit datagrid og det opdatere perfekt! så skriv hvis i har nogle spg...hihi :)

Mvh. PabloPablo
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