webForumDet fria alternativet

Olika färg på font i listbox

.NETur .NET

9 svar · 764 visningar · startad av saw

Medlem sedan mars 20011 880 inlägg
Frågan#1

Jag sitter och sliter håret av mig. Jag fick tips om den här koden, men kan inte få den att fungera.

bool test=Convert.ToBoolean(ds1.Tables["frånTitel"].Rows[a]["hide"] );
{
Skiva ny = (new Skiva(ds1.Tables["frånTitel"].Rows[a]["Songtitel"].ToString(),test));
listBoxFyllTitlar.Items.Add(ny); 
}
//class skiva
public class Skiva 
{ 
private bool hide=false; 
public bool Hide 
{ 
get{return hide;} 
set{hide=value;} 
} 
private string title=""; 
public Skiva(string titel, bool hide) 
{ 
this.title=titel; 
this.hide=hide; 
} 
public override string ToString() 
{ 
return title; 
} 
} 
//class DrawItemHandler
private void DrawItemHandler(object sender, DrawItemEventArgs e) 
{ 
Skiva rita=(Skiva)listBoxFyllTitlar.Items[e.Index]; 
Color front; 
e.DrawBackground(); 
e.DrawFocusRectangle(); 
if(rita.Hide) front=Color.Gray; 
else front=Color.Black; 
e.Graphics.DrawString(rita.ToString(),new Font
(FontFamily.GenericSansSerif, 14, FontStyle.Bold),new SolidBrush
(front,e.Bounds)); 

}
//Error:
(514): Argument '2': cannot convert
 from 'System.Drawing.Rectangle' to 'bool'

(514): No overload for method 'DrawString' takes '3' arguments

(514): The best overloaded method match
 for 'System.Drawing.SolidBrush.SolidBrush
(System.Drawing.Color, bool)' has some invalid arguments

MAO vad jag ville ha är, om hide=true då skall den texten stå med grå font färg, annars så skall det vara svart font färg.
Vore väldigt tacksam för all hjälp.

Medlem sedan juni 20022 599 inlägg
#2

Verkar som du snubblat på paranteserna. Så här borde det se ut:

e.Graphics.DrawString(rita.ToString(),new Font
(FontFamily.GenericSansSerif, 14, FontStyle.Bold),new SolidBrush
(front),e.Bounds);
Medlem sedan mars 20011 880 inlägg
#3

Tack niko, inga mer error, men ingen grå text heller.
Denna koden är till för att färga vissa namn i en listbox, men den vill inte reagera.
Jag har ändrat:

bool test=ds1.Tables["frånTitel"].Rows[a]["hide"].ToString()=="true";

I debugen så ser jag att koden går olika vägar, beroende på true/false, men ingen grå text.

Medlem sedan juni 20022 599 inlägg
#4

men ingen grå text heller.

Nej, jag förstår egentligen inte hur koden är tänkt att fungera eller var DrawItemHandler anropas. Såvitt jag ser borde man gå till väga på samma sätt som i den här tråden dvs subklassa listboxen och overrida OnDrawItem i den ärvda klassen.

Alltså så här:

Medlem sedan mars 20011 880 inlägg
#5

Tack nika.
Jag är tydligen inte helt bort i alla fall, jag fick det att fungera.
Det var en del petande, men...

Det som är så trits med den här typen av kod, är att listboxen försvinner i disignläge. Jag vet att du sa att det skulle kunna gå att fixas, men jag lyckas inte.
Hur som helst, tusen tack för att du finns, och inte har givet upp med allt mitt "tramsande".

Medlem sedan juni 20022 599 inlägg
#6

Det som är så trits med den här typen av kod, är att listboxen försvinner i disignläge.

Jo, det är ett problem. Vad som händer är att man får ett compile-error och VS.NET sen ibland av nån anledning får för sig att plocka bort all kod inne i InitializeComponent som den inte skrivit själv. Det är irriterande och jag vet ingen bra lösning förutom att spara undan all kod i InitializeComponent i en textfil så att man kan återställa efter det hänt.

Fast om ska vara ärlig så finns det ju en varning för manuellt pillande:

/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.

En annan lösning är att gå den lite längre vägen och kompilera sina grafiska klasser som usercontrols så man har tillgång till dem i toolboxen.

Medlem sedan mars 20011 880 inlägg
#7

Som du beskriver det, så är det väll bara att göra en usercontroll.
En ide vore ju att byta ut true/false mot t ex farg(färg) då är man ju inte bunden, och har större nytta av det i andra project.

Avslutningsvis så måste jag fråga, om jag ville ändra backgrundsfärgen också(alltså bakgrunden på just namnet, inte hela listboxen) kompicera det väldigt mycket?

Medlem sedan juni 20022 599 inlägg
#8

Som du beskriver det, så är det väll bara att göra en usercontroll.

Ja, som sagt, det är nog det absolut bästa. Det som tar en stund är att man måste mappa alla listboxens properties och events in och ut till controllen om den ska bli användbar och flexibel.

En ide vore ju att byta ut true/false mot t ex farg(färg) då är man ju inte bunden, och har större nytta av det i andra project.

Ja, du borde ju ändra i definitionen av Skiva så att den tar emot en Color istället för en bool.

Avslutningsvis så måste jag fråga, om jag ville ändra backgrundsfärgen också(alltså bakgrunden på just namnet, inte hela listboxen) kompicera det väldigt mycket?

Nej, det borde räcka med att anropa FillRectangle innan DrawString.
Exempel:

e.Graphics.FillRectangle(new SolidBrush(Color.Green),e.Bounds);
e.Graphics.DrawString ....
Medlem sedan mars 20011 880 inlägg
#9

Om jag förstår dig rätt, så ärver inte en usercontroll(listboxen)dessa egenskaper?(vad som händer om man klickar osv).

Medlem sedan juni 20022 599 inlägg
#10

Nej, precis. En usercontroll är ju bara en grafisk yta på vilken det kan ligga flera olika andra kontroller (listboxar, knappar, textboxar osv ..). Vill man att vissa av eventsen för dessa ska skickas vidare "utåt" så måste man själv skriva kod för detta. Och samma sak för de properties man vill exponera utåt.

I detta fall så är det ju tex inte UserControllen i sig som ska ärva av ColoredListBox utan ett objekt på kontrollens yta som ska göra det.

134 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)