Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Različite boje texta u listBoxu (C#, VB)

[es] :: .NET :: .NET Desktop razvoj :: Različite boje texta u listBoxu (C#, VB)

[ Pregleda: 3388 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

torb-d-man

Član broj: 156284
Poruke: 124



Profil

icon Različite boje texta u listBoxu (C#, VB)11.04.2008. u 17:35 - pre 195 meseci
Pozdrav svim stručnjacima na ES-u. Imam problem sa listBoxom (radim u Visual Studio 2005 , C#). Naime ne znam kako da u toku izvršavanja programa dodeljujem različite boje texta različitim Items-ima u mom listBoxu. Koja će boja ići za koji red zavisiće od nekih mojih proračuna
u programu ... Tako da ako se neko bavio ovom tematikom neka napiše koju word of wisdom (može i u VB-u). Unapred hvala na svakoj pomoći.
 
Odgovor na temu

01011011

Član broj: 561
Poruke: 2341
65.216.70.*



+2 Profil

icon Re: Različite boje texta u listBoxu (C#, VB)11.04.2008. u 23:58 - pre 195 meseci
Code:
            tvojlistBox.Items[1].Attributes.CssStyle.Add("color", "red");


ovo ce ti promjeniti boju u crvenu. Nadam se da mozes skontati sta treba da uradis. Broj 1 ti je index od listitema 1, tu stavljas koji ces index da mijenjas boju.
 
Odgovor na temu

torb-d-man

Član broj: 156284
Poruke: 124



Profil

icon Re: Različite boje texta u listBoxu (C#, VB)12.04.2008. u 22:50 - pre 195 meseci
Ja kad napišem ovo:
Code:

if (lisPlayground.Items.Count > 0) 
            {
                for (int i = 0; i < lisPlayground.Items.Count; i++) 
                {
                    lisPlayground.Items[i].Attributes.CssStyle.Add("color", "red");
                }
            }

on meni podvuče 'Attributes' i kaže: 'object' does not contain a definition for 'Attributes',
odnosno kad stavim tačku posle Items. on u code hints-u nema 'Attributes'
Zaboravio sam da kažem da je moja aplikacija par win formi i moj listBox je iz {System.Windows.Forms} namespace-a
 
Odgovor na temu

Djoks
Djordje Najdanovic
Software Developer
Azalea Maritime

Član broj: 1630
Poruke: 268
85.94.122.*

Sajt: www.azalea-maritime.com


Profil

icon Re: Različite boje texta u listBoxu (C#, VB)13.04.2008. u 00:20 - pre 195 meseci
Ako je boja teksta u pitanju -> http://msdn2.microsoft.com/en-...ws.forms.listbox.drawitem.aspx
Ako treba promijeniti i boju pozadine - javi, pa ću napisati primjer za to.
 
Odgovor na temu

torb-d-man

Član broj: 156284
Poruke: 124



Profil

icon Re: Različite boje texta u listBoxu (C#, VB)13.04.2008. u 20:21 - pre 195 meseci
@Djoks
Osećaj se slobodnim da napišeš primer za boju pozadine. Inače danas sam gledao na tvom linku
kako se piše ListBox DrawItem Event, probao, skapirao i vrši mi posao za moju apl. Iako ima tu
jedna stvar koja mi se ne sviđa. Kada u InitializeComponent() napišem:
Code:

moj_listBox.Items.AddRange(new object[] { "prva", "druga", "treća linija" }); // ili mnogo više od tri
to znači da će mi biti text u boji samo u prve tri linije. Ako posle te tri (ili više) linije budem radio:
Code:

moj_listBox.Items.Add("sledeći string");
taj sledeći string će biti default boje (crn). Verovatno može da se napiše funkcija u kojoj
će se u toku izvršavanja programa pozivati nešto ovako:
Code:

moj_listBox.AddRange(new object[] {"sa koliko god Items-a mi je potrebno"});

.
.
switch (e.Index)
    {
        case 0:
        case 1:
        case 2:
        case 3: myBrush = Brushes.Lime; break;
        case 4:
        .
        .// sa koliko god Item-a  mi je potrebno
        .
        case 22:
        case 23: myBrush = Brushes.DimGray; break;
           
    }
ali to još nisam probao. U ovom trenutku mi nije nepohodno ... itd.
A kako bi se boja pozadine podesila ?
 
Odgovor na temu

Djoks
Djordje Najdanovic
Software Developer
Azalea Maritime

Član broj: 1630
Poruke: 268
77.222.5.*

Sajt: www.azalea-maritime.com


Profil

icon Re: Različite boje texta u listBoxu (C#, VB)13.04.2008. u 21:50 - pre 195 meseci
OK, evo kod-a. Nemoj zamjeriti - u VB-u je (tu sam "na svome"), ali siguran sam da nećeš imati problema sa prevodom:

Code:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ListBox1.DrawMode = DrawMode.OwnerDrawFixed

        ListBox1.Items.Add("Marko")
        ListBox1.Items.Add("Petar")
        ListBox1.Items.Add("Janko")
        ListBox1.Items.Add("Milutin")
        ListBox1.Items.Add("Vukoje")

    End Sub

    Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
        ' Nema item-a - nema boje
        If e.Index = -1 Then Exit Sub

        ' Deklarisem brush-eve koje ce cuvati vrijednosti boja za tekst, pozadinu, kao i font teksta
        Dim TekstBrush As SolidBrush
        Dim PozadinaBrush As SolidBrush
        Dim TekstFont As Font

        If e.Index / 2 = CInt(e.Index / 2) Then
            ' Svaki parni dodati red, imace pozadinu boje Gainsboro
            TekstBrush = New SolidBrush(Color.Blue)
            PozadinaBrush = New SolidBrush(Color.Gainsboro)
        Else
            ' Svaki neparni red, imace boju pozadine LightYellow
            TekstBrush = New SolidBrush(Color.Blue)
            PozadinaBrush = New SolidBrush(Color.LightYellow)
        End If

        ' Ako je red trenutno selektovan - odredjujemo posebnu boju za njega
        If e.State And DrawItemState.Selected Then
            PozadinaBrush = New SolidBrush(Color.BlueViolet)
            TekstBrush = New SolidBrush(Color.LimeGreen)
            ' Hocemo da naglasimo tekst selektovanog reda kurzivnim slovima
            TekstFont = New Font(Form.DefaultFont.Name, Form.DefaultFont.Size, FontStyle.Bold)
        Else
            TekstFont = Form.DefaultFont
        End If

        ' Konacno iscrtavamo nas red
        e.Graphics.FillRectangle(PozadinaBrush, e.Bounds)
        e.Graphics.DrawRectangle(Pens.Gray, e.Bounds)
        Dim R As New RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height)
        e.Graphics.DrawString(ListBox1.Items(e.Index).ToString, TekstFont, TekstBrush, R)
        e.DrawFocusRectangle()

    End Sub


Dakle, imam jedan ListBox1, Button1 i hvatam događaj ListBox1.DrawItem. U primjeru farbam sve: pozadinu, slova, border, pozadinu selektovanog reda, kao i slova selektovanog reda i font. Nisam htio mnogo da "kinđurim" ListBox sadržaj, pa sam za tip fonta i veličinu koristio vrijednosti iz Form.DefaultFont, međutim ti prepravi kako ti odgovara.

Na tebi je kako ćeš organizovati dodjelu boja, ali s' obzirom da ListBox može da bind-uje kolekciju - objekat u sebi može imati informaciju o boji koju možeš ispitati unutar procedure DrawItem, i tako dodijeliti odgovarajuću boju Item-a zapisanu u objektu koji se smješta u kontrolu. Ako ti se taj način čini smislenim, a nisi siguran kako bi ga napisao - napisaću ti jedan primjer.
 
Odgovor na temu

torb-d-man

Član broj: 156284
Poruke: 124



Profil

icon Re: Različite boje texta u listBoxu (C#, VB)14.04.2008. u 20:02 - pre 195 meseci
Preveo sam tvoj kod u ovo:
Code:

private void lisPlayground_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
        {
           
            // Nema item-a - nema boje
        if(e.Index == -1) goto ExitSub;

        // Deklarisem brush-eve koje ce cuvati vrijednosti boja za tekst, pozadinu, kao i font teksta
        SolidBrush TekstBrush;
        SolidBrush PozadinaBrush;
        Font TekstFont;
            //= new Font("Lucida Console", 8.25F, System.Drawing.FontStyle.Regular
            //          , System.Drawing.GraphicsUnit.Point, ((byte)(238)));

        if(e.Index % 2 == 0){
            // Svaki parni dodati red, imace pozadinu boje Gainsboro
            TekstBrush = new SolidBrush(Color.Black);
            PozadinaBrush = new SolidBrush(Color.Gray);}
        else{
            // Svaki neparni red, imace boju pozadine LightYellow
            TekstBrush = new SolidBrush(Color.Black);
            PozadinaBrush = new SolidBrush(Color.DimGray);
            }
        //MessageBox.Show("e.State == DrawItemState.Selected: " + (e.State == DrawItemState.Selected));
        // Ako je red trenutno selektovan - odredjujemo posebnu boju za njega
        if(e.State == DrawItemState.Selected){    // ovo ovde mi je uvek FALSE
            MessageBox.Show("Selektovan red: " + (e.Index + 1) + ".");
            PozadinaBrush = new SolidBrush(Color.AliceBlue);
            TekstBrush = new SolidBrush(Color.MediumVioletRed);
            // Hocemo da naglasimo tekst selektovanog reda kurzivnim slovima
            TekstFont = new Font(Form.DefaultFont.Name, Form.DefaultFont.Size, FontStyle.Bold);}
            else TekstFont = new Font("Lucida Console", 8.25F, System.Drawing.FontStyle.Regular
                                     , System.Drawing.GraphicsUnit.Point, ((byte)(238))); 
           
        // Konacno iscrtavamo nas red
        e.Graphics.FillRectangle(PozadinaBrush, e.Bounds);
        //e.Graphics.DrawRectangle(Pens.Orange, e.Bounds);  ovo sam namerno izostavio
        RectangleF R = new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);
        e.Graphics.DrawString(lisPlayground.Items[e.Index].ToString(), TekstFont, TekstBrush, R);
        e.DrawFocusRectangle();


        ExitSub:;
}


i sve radi sem jedne stvari. Nikako mi ne radi bojenje selektovanog reda. Ako sam te dobro razumeo
moglo bi se reći da se na svaki SelectedIndexChanged event se menjaju boje pozadine i texta selektovanog reda.
Da li sam u pravu ? Ako je tako možda sam ja loše preveo uslov za 'šta je selektovano'.
Code:

//Ovo
If e.State And DrawItemState.Selected Then '...
//sam preveo u ovo
if(e.State == DrawItemState.Selected){//...}  
//a za ovo
if(e.State && DrawItemState.Selected){//...}
//mi kaže da ne mogu operator '&&' da koristim za operande tipa 'tog' i 'tog'

Nisam oko ovog bojenja selektovane linije uspeo da se snađem. Ako bi mogao to da mi pojasniš ?
 
Odgovor na temu

Djoks
Djordje Najdanovic
Software Developer
Azalea Maritime

Član broj: 1630
Poruke: 268
77.222.1.*

Sajt: www.azalea-maritime.com


Profil

icon Re: Različite boje texta u listBoxu (C#, VB)14.04.2008. u 22:18 - pre 195 meseci
Evo prepravljenog kod-a. Priznajem - nije baš "by the book", ali će raditi kako Bog zapovijeda. Izbacio sam ti ono GoTo ...

Code:

        private void lisPlayground_DrawItem(object sender, DrawItemEventArgs e)
        {
            if (e.Index == -1)
                return;
            
            SolidBrush TekstBrush;
            SolidBrush PozadinaBrush;
            Font TekstFont;

            if (e.Index % 2 == 0)
            {
                TekstBrush = new SolidBrush(Color.Black);
                PozadinaBrush = new SolidBrush(Color.Gray);
            }
            else
            {
                TekstBrush = new SolidBrush(Color.Black);
                PozadinaBrush = new SolidBrush(Color.DimGray);
            }
            if ((int) e.State != 768)
            {
                PozadinaBrush = new SolidBrush(Color.Black);
                TekstBrush = new SolidBrush(Color.Yellow);
                TekstFont = new Font(Form.DefaultFont.Name, Form.DefaultFont.Size, FontStyle.Bold);
            }
            else TekstFont = new Font("Lucida Console", 8.25F, System.Drawing.FontStyle.Regular
                                     , System.Drawing.GraphicsUnit.Point, ((byte)(238)));

            e.Graphics.FillRectangle(PozadinaBrush, e.Bounds);
            RectangleF R = new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);
            e.Graphics.DrawString(lisPlayground.Items[e.Index].ToString(), TekstFont, TekstBrush, R);
            e.DrawFocusRectangle();
        }


Javi da li je sad OK :-)
 
Odgovor na temu

torb-d-man

Član broj: 156284
Poruke: 124



Profil

icon Re: Različite boje texta u listBoxu (C#, VB)15.04.2008. u 16:43 - pre 195 meseci
E sada radi odlično. Hvala Djoks. Ovaj tvoj uslov je dobar ' if ((int)e.State != 768) '.
Gore si pomenuo da listBox može da binduje kolekciju. Kako ? Da li to znači da moja kolekcije može biti sastavljena od primeraka neke klase gde će svaki primerak sadržati svoju javnu promenljivu tipa 'Color'. A zatim da u okviru DrawItem fu-je pomoću indexa 'e.Index' ispitujem taj određeni elemenat kolekcije i dodeljujem boju Itemu (ili ceo neki style -> font,size,color ext.). Da li bi se moralo onda podesiti svojstvo ' lstBox.DataSource = nešto;' Na koji način se vrši to bindovanje sa kolekcijom ?
 
Odgovor na temu

Djoks
Djordje Najdanovic
Software Developer
Azalea Maritime

Član broj: 1630
Poruke: 268
77.222.8.*

Sajt: www.azalea-maritime.com


Profil

icon Re: Različite boje texta u listBoxu (C#, VB)15.04.2008. u 18:07 - pre 195 meseci
Abso-freakin-lutely! ;)

Kod bindovanja ovih prostijih kontrola na objekte iz kolekcije - moraš voditi računa o tome da unutar tog objekta ručno implementiraš ToString() funkciju, jer kontrole prikazuju na ekranu ono što vraća funkcija ToString() bilo to ComboBox, ListBox itd. Vidjećeš da funkcija ToString() vraća mNaziv, u protivnom da nije implementirana - vraćala bi uvijek naziv tipa klase - (WindowsApplication1.Playground), što nije baš user-friendly.

Elem, da ne dužim mnogo sa tekstom - svi komentari su u kod-u:

Code:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        // Deklarisem jednu kolekciju objekata Playground
        private List<Playground> Playgrounds = new List<Playground>();
        
        public Form1() 
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            lisPlayground.DrawMode = DrawMode.OwnerDrawFixed;

            // Dodajem nekoliko novih objekata Playground u kolekciju
            Playgrounds.Add(new Playground("Playground #1", Color.Blue));
            Playgrounds.Add(new Playground("Playground #2", Color.Pink));
            Playgrounds.Add(new Playground("Playground #3", Color.Green));
            Playgrounds.Add(new Playground("Playground #4", Color.Olive));

            // Vezujem DataSource kontrole za kolekciju
            lisPlayground.DataSource = Playgrounds;
        }

        private void lisPlayground_DrawItem(object sender, DrawItemEventArgs e)
        {
            if (e.Index == -1)
                return;
            
            SolidBrush TekstBrush;
            SolidBrush PozadinaBrush;
            Font TekstFont;

            // Neka, recimo, tekst slova biva odredjen parametrom Color iz objekta Playground
            TekstBrush = new SolidBrush(((Playground)lisPlayground.Items[e.Index]).Color);

            // Boje pozadine neka, recimo, budu vec predodredjene kao ranije
            if (e.Index % 2 == 0)
            {
                PozadinaBrush = new SolidBrush(Color.Gray);
            }
            else
            {
                PozadinaBrush = new SolidBrush(Color.DimGray);
            }

            // Nasa famozna provjera :-))
            if ((int) e.State != 768)
            {
                PozadinaBrush = new SolidBrush(Color.Black);
                TekstBrush = new SolidBrush(Color.Yellow);
                TekstFont = new Font(Form.DefaultFont.Name, Form.DefaultFont.Size, FontStyle.Bold);
            }
            else TekstFont = new Font("Lucida Console", 8.25F, System.Drawing.FontStyle.Regular, 
                System.Drawing.GraphicsUnit.Point, ((byte)(238)));

            // Ostalo, isto kao ranije
            e.Graphics.FillRectangle(PozadinaBrush, e.Bounds);
            RectangleF R = new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height);
            e.Graphics.DrawString(lisPlayground.Items[e.Index].ToString(), TekstFont, TekstBrush, R);
            e.DrawFocusRectangle();
        }
    }

    public class Playground
    {
        // Jedan simpaticni konstruktor, kako bi lakse dodjeljivali vrijednosti parametrima
        // Elem, Visual Studio 2008 uvodi novitet, pa nam ovo ne treba - ali ne znam koju verziju koristis
        public Playground(string vNaziv, Color vColor)
        {
            this.mNaziv = vNaziv;
            this.mColor = vColor;
        }

        private string mNaziv;
        public string Naziv
        {
            get { return mNaziv; }
            set { mNaziv = value; }
        }
        
        private Color mColor;
        public Color Color
        {
            get { return mColor; }
            set { mColor = value; }
        }

        // Najvazniji momenat - ovdje se odredjuje sta ce biti prikazano u listbox-u za
        // svaku pojedinacnu stavku
        public override string ToString()
        {
            return this.mNaziv;
        }
    }

}


Nadam se da će biti od koristi. :-)
 
Odgovor na temu

Djoks
Djordje Najdanovic
Software Developer
Azalea Maritime

Član broj: 1630
Poruke: 268
77.222.8.*

Sajt: www.azalea-maritime.com


Profil

icon Re: Različite boje texta u listBoxu (C#, VB)15.04.2008. u 18:13 - pre 195 meseci
Da, zaboravih - kad ti zatreba podatak o nekoj stavki iz liste - posluši se "kastovanjem" u formatu: ((Playground)lisPlayground.Items[IndeksStavke]).NazivPropertyja ;-)
 
Odgovor na temu

torb-d-man

Član broj: 156284
Poruke: 124



Profil

icon Re: Različite boje texta u listBoxu (C#, VB)16.04.2008. u 15:41 - pre 195 meseci
Svakako da hoće.
OK. Ovo sada radi dobro. Uf imedzn d posbiltiz !!! Ali nije mi jasno do kraja kako bih ja sad mogao da editujem sadržaj listBoxa,
pošto kad god to probam on kaže 'ne možeš da edituješ zato što je podešeno svojstvo DataSource listBox-a'. Ja uspevam da
promenim sadržaj Playgrounds kolekcije ali ne listBoxa. Kako se to radi ?
 
Odgovor na temu

Djoks
Djordje Najdanovic
Software Developer
Azalea Maritime

Član broj: 1630
Poruke: 268
*.crnagora.net.

Sajt: www.azalea-maritime.com


Profil

icon Re: Različite boje texta u listBoxu (C#, VB)16.04.2008. u 16:50 - pre 195 meseci
Eee, sadržaj ListBox-a mijenjaš kroz kolekciju na koju je ovaj vezan. Recimo ovako:

Code:

        private void button1_Click(object sender, EventArgs e)
        {
            lisPlayground.BeginUpdate();
            Playgrounds[2].Naziv = "Bla Bla Bla";
            Playgrounds[3].Color = Color.Beige;
            lisPlayground.EndUpdate();
        }
 
Odgovor na temu

torb-d-man

Član broj: 156284
Poruke: 124



Profil

icon Re: Različite boje texta u listBoxu (C#, VB)16.04.2008. u 20:24 - pre 195 meseci
Pa da. Mora da se apdejtuje. Kao pravljenje konekcije.
... Vidiš ovaj ES ipak nečemu služi :D haha...
Hvala Djoks na pomoći.
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Različite boje texta u listBoxu (C#, VB)

[ Pregleda: 3388 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.