Avatar billede mhass Nybegynder
19. november 2006 - 16:49 Der er 11 kommentarer og
1 løsning

Conditional formating i DataGrid

Er der nogen der ved om man kan lave conditional formating som i Excel. Jeg har en liste over jobs der bliver hentet i listen, og kollonnen stausid har værdi 1 eller 2. Kan man f.eks. farve rækken rød hvis denne værdi er = 1?
Avatar billede joern Nybegynder
20. november 2006 - 10:00 #1
Hej.
Jeg bruger ikke datagrid, men msflexgrd.    Mon ikke det samme kan gøres i datagrid?  her er et eksempel fra et af mine programmer, i stedet for CellbackColor kan man anvende RowBackColor



'indlæsning i grid
  '-------------------------------------
  grindhold.Rows = u + 1
  For Y = 1 To u
    For z = 0 To 14
      grindhold.Row = Y
      grindhold.Col = z
      grindhold.Text = musik(z, Y - 1)
      If z = 2 Then If musik(8, Y - 1) = "mp3" Then grindhold.CellBackColor = RGB(91, 255, 91)
      If z = 2 Then If musik(8, Y - 1) = "mpg" Then grindhold.CellBackColor = RGB(255, 127, 255)
    Next
    txtnr.BackColor = RGB(255, 255, 255)
  Next
  '--------------------------------------
Avatar billede mhass Nybegynder
20. november 2006 - 12:01 #2
Sætter du koden ind via en form_load event? Er stadig lidt rusten i VB :-)
Avatar billede joern Nybegynder
20. november 2006 - 12:28 #3
Nej.

Det skal være i den subrutine, hvor du indlæser data.  Farven skal jo sættes i hver række efterhånden som data også indlæses.

Alternativt kan man lave en knap eller lign. kontrol, hvor indholdet i gridden gennemses og så sættes farven når betingelsen er sand.
Avatar billede mhass Nybegynder
28. november 2006 - 23:58 #4
Joern, jeg er måske lidt for rusten til at forstå det. Data'en bliver indlæst via indstillingerne på DataGrid'et så jeg ved ikke rigtigt hvor jeg skulle indsætte koden henne for der er ikke nogen Sub der gennemløber men den skal jeg vel bare oprette i et modul, eller?

Der hvor du skriver grindhold.Rows skal jeg vel bare skrive dgtask.Rows da DataGrid'et hedder dgtask eller er jeg helt i skoven?
Avatar billede joern Nybegynder
29. november 2006 - 10:28 #5
Hej,

Det er vel ikke noget VBA til Access du arbejder med?  ...og ikke rigtig Visual Basic.

Men det er korrekt at navnet skal være det, der gælder for din kontrol.  Er der ikke andre subrutiner, kan du jo lave en knap.  Men ikke noget med modul, bare i din form.
Avatar billede mhass Nybegynder
29. november 2006 - 23:56 #6
Nej det er ikke VBA men VB6. Hvordan ser koden ud i det eksempel du selv brugte ovenstående kode i, for jeg kan ikke lige fange den?
Avatar billede mhass Nybegynder
30. november 2006 - 00:34 #7
Jeg har kigget på dit eksempel ovenfor igen Joern, og med mine navne så det således ud:

    'Indlæsning i grid
      '-------------------------------------
      flextask.Rows = h + 1
      For Y = 1 To h                '- 1
        For z = 0 To 8
          flextask.Row = Y
          flextask.Col = z
          If z = 8 Then
            If statusname(8, Y - 1) = "Ongoing" Then
                flextask.CellBackColor = RGB(91, 255, 91)
                flextask.Text = statusname(z, Y - 1)
        Next
        txtnr.BackColor = RGB(255, 255, 255)
      Next
      '--------------------------------------

flextask = Navnet på mit flexgrid
statusname = navnet på kollonen der skal tjekkes
Ongoing = Værdien der skal tjekkes efter

Når jeg så kører den siger den "sub or function not defined" og markerer "statusname" på linjen der starter med "If statusname(8..."

Har du nogen ideer? Skal nok smide nogle point efter dig :-)
Avatar billede joern Nybegynder
30. november 2006 - 00:55 #8
Hej.

I mit eksempel har jeg et array i 2 dimensioner, hvor den første er felterne i databasen og den anden er posterne.  Mit felt 8 indeholder oplysning om, at en melodipost også har en MP3-fil, når det er tilfældet får en af cellerne den farve der i RGB er lysgrøn - 255 er fuldt grøn og med lige meget rød og blå bliver den bare lysere.  Du kan også vælge blandt VB's faste 16 farver eller angive farven med HEX.

Så hvis din værdi "ongoing" ikke står i felt 8, skal du ændre tallet til det felt, hvor det står.  Men hvis du slet ikke anvender array, skal du jo gennemløbe din grid ved at sætte row til at skifte i en løkke.

Col = 6    'hvis din værdi står i række 6

For a = 0 to flextask.rows
  row = a
  if flextask.text = "Ongoing" then flextask.row backcolor = RGB(255,0,0)  'Rød
next a

Til inspiration....
Avatar billede mhass Nybegynder
30. november 2006 - 01:11 #9
Din række med "flextask.Row BackColor" giver fejl ved BackColor, men med følgende får jeg den til at gøre alle rækkerne grønne:

For a = 0 To flextask.Rows
  Row = a
  Label1.Caption = flextask.Rows
    If flextask.Text = "Ongoing" Then
        flextask.BackColor = RGB(255, 0, 0) 'Rød
    Else
        flextask.BackColor = RGB(0, 255, 0) 'Grøn
    End If
Next a

flextask.text er hele tiden lig med ID værdien som er den første kollone i flexgrid'et og det er der fejlen er tror jeg. Jeg prøvede dog lige at flytte feltet der indeholder "Ongoing" frem som det første felt, men alle felter forbliver stadigt grønne....strange
Avatar billede joern Nybegynder
30. november 2006 - 10:51 #10
Hej.

I mit eksempel 00:55 mangler et punktum mellem row og backcolor, kan jeg se.

Label1 i dit seneste indeholder vel blot antallet af rækker.  Row er den aktuelle række og rows er totalen af rækker.

Sammenligninger i VB er case-sensitiv, er du sikker på at Ongoing starter med stort?  Ellers:

If lcase(flextask.Text) = "ongoing" Then...
Avatar billede mhass Nybegynder
30. november 2006 - 11:13 #11
Hmmm, når jeg ændrer linjen til at være:

  flextask.Row.BackColor = RGB(255, 0, 0) 'Rød

Kommer der en fejl "Invalid qualifier"...
Avatar billede joern Nybegynder
30. november 2006 - 12:19 #12
Hej.

I msflxgrd kan man sætte farver på rækker, kolonner eller celler.  Du må kigge om denne property findes for den grid, du anvender.

Måske kan den grid ikke fungere med RBG-funktionen.

Using Defined Constants
You don’t need to understand how color values are generated if you use the intrinsic constants listed in the Object Browser. In addition, intrinsic constants do not need to be declared. For example, you can use the constant vbRed whenever you want to specify red as a color argument or color property setting:

BackColor = vbRed

Using Direct Color Settings
Using the RGB function or the intrinsic constants to define color are indirect methods. They are indirect because Visual Basic interprets them into the single approach it uses to represent color. If you understand how colors are represented in Visual Basic, you can assign numbers to color properties and arguments that specify color directly. In most cases, it’s much easier to enter these numbers in hexadecimal.

The valid range for a normal RGB color is 0 to 16,777,215 (&HFFFFFF&). Each color setting (property or argument) is a 4-byte integer. The high byte of a number in this range equals 0. The lower 3 bytes, from least to most significant byte, determine the amount of red, green, and blue, respectively. The red, green, and blue components are each represented by a number between 0 and 255 (&HFF).

Consequently, you can specify a color as a hexadecimal number using this syntax:

&HBBGGRR&

The BB specifies the amount of blue, GG the amount of green, and RR the amount of red. Each of these fragments is a two-digit hexadecimal number from 00 to FF. The median value is 80. Thus, the following number specifies gray, which has the median amount of all three colors:
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
Kurser inden for grundlæggende programmering

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