Iofs en Listbox men principen borde vara samma: http://www.codeproject.com/cs/combobox/glistbox.asp.
Kan manpå någotvis lägga in iconer i en combobox? :q
24 svar · 505 visningar · startad av saw
Kan manpå någotvis lägga in iconer i en combobox? :q
Iofs en Listbox men principen borde vara samma: http://www.codeproject.com/cs/combobox/glistbox.asp.
Jag får det tyvärr inte att fungera.
Skulle vara tacksam om någon skulle vilja förklara för mig om public class?
Är det en egen class-fil, eller skall det bara in i formen?
Nu har jag inte testat koden, men var du deklarerar GListBoxItem och GListBox saknar betydelse. Du kan lägga dem i varsin klassfil, i två klassfiler eller tom i samma fil som formen (fast i såf utanför formets klass, så klart).
Sen måste du också se till att den listbox du använder på formet ärver av GListBox.
>
>Sen måste du också se till att den listbox du använder på >formet ärver av GListBox.
Med det menar du listbox1 new GListBox?
Under ToDo?
Jag har problem.
if (item.ImageIndex != -1)
{
imageList.Draw(e.Graphics, bounds.Left,bounds.Top,item.ImageIndex);
e.Graphics.DrawString(item.Text, e.Font, new SolidBrush(e.ForeColor),
bounds.Left+imageSize.Width, bounds.Top);
}
Error:
E:\C#\SAW\SAW\frmKunder.cs(1499): Cannot access a nonstatic
member of outer type 'SAW.frmKunder' via nested
type 'SAW.frmKunder.GListBox'
Är det dags att ge upp?
Av felmeddelandet så låter det som om du deklarerat GListBox inuti Formens klass. Ungefär så här
public class frmKunder : System.Windows.Forms.Form
{
public class GListBox
{
// Koden för GlistBox.
}
//Koden för Formet.
}
Varken GListBox eller GListBoxItem kan vara inre klasser du måste alltså deklarera klasserna utanför varandra om de ligger i samma fil:
public class GListBox
{
// Koden för GlistBox.
}
public class GListBoxItem
{
// Koden för GListBoxItem.
}
public class frmKunder : System.Windows.Forms.Form
{
//Koden för Formet.
}
Jag har gjort precis som du har visat. Där finns desutom imgelist som det skall vara.
Trots detta så får jag error:
E:\C#\SAW\SAW\frmKunder.cs(1532): The type or namespace
name 'frmKunder' could not be found (are you missing a using
directive or an assembly reference?)
Om jag lägger det i en egen class-fil, så får jag samma error.
saw skrev:
Om jag lägger det i en egen class-fil, så får jag samma error.
Om du verkligen lagt klasserna utanför varandra men inom samma namespace så borde du ju inte kunna få det felet. Men det är svårt att säga vad som är fel om man inte ser nån kod.
Det verkar i vilket fall som helst finnas ett fel i koden för GListBox:
imageList.Draw(e.Graphics, bounds.Left,bounds.Top
borde vara:
_myImageList.Draw(e.Graphics, bounds.Left,bounds.Top
.. tycker jag?
Hej Niko, och hjättetack för att du försöker.
Detta är gjort:
Hela koden ligger kopierad nedanför namnspacen(den är lite lång så jag ville inte klistra in den).
Sen i under ToDo, så drar den igång en class, där:
GListBox lb = new GListBox();
lb.ImageList = imageList;
lb.Items.Add( new GListBoxItem("Image 1",0));
lb.Items.Add( new GListBoxItem("Image 2",1));
lb.Items.Add(new GListBoxItem("Hej o hopp",1));
Nu får jag inga som helst error......men inte heller någonting i listboxen.
Jag har t o med döpt listboxen i samma namn...
Nu får jag inga som helst error......men inte heller någonting i listboxen.
OK, men du måste kodmässigt lägga listboxen på Formen också (this.Controls.AddRange ..) och lägga in ikoner i imagelisten. Man kan inte påstå att det direkt framgår av artikeln.
Men nu är C#/VS.NET tyvärr lika bökigt att diskutera utan att se hela projektkoden som C++/MFC.
Så för enkelhetens skull:
http://member.webforum.nu/3773/sawbox.zip
1. Jag har definierat GListBox och GListBoxItem i en egen klassfil.
2. Jag har placerat en imagelist med 3 ikoner i på formuläret.
3. Jag har lagt en helt vanlig Listbox på formuläret och sen i koden ändrat manuellt så att den ärver av GListBox istället för ListBox.
4. Jag lägger till raderna:
this.Controls.AddRange(new System.Windows.Forms.Control[] {this.lb});
this.lb.ImageList = this.imageList1;
lb.Items.Add( new GListBoxItem("Image 1",0));
lb.Items.Add( new GListBoxItem("Image 2",1));
lb.Items.Add( new GListBoxItem("Image 3",2));
I form_load (den första raden flyttar jag från InitializeComponent, se nedan).
5. Som du ser så funkar det (förhoppningsvis) även hos dig när du kör programmet (i design ser du inget).
Om du vill se Listboxen även under design (för att tex ändra storlek) så kan du flytta:
this.Controls.AddRange(new System.Windows.Forms.Control[] {this.lb});
till slutet av InitializeComponent-funktionen fast då får du ett felmeddelande i designläget som egentligen inte spelar nån roll (men det är irriterande).
Och slutligen:
Ändrar du:
public class GListBox : ListBox
till:
public class GListBox : ComboBox
så får du en combobox med ikoner. Det funkar lika bra.
Tack för ditt fina arbete. Din application fungerar(narturligtvis).
Jag försöker då att göra likadant...
Classfilen, inga problem.
Laddar jag:
listBoxTotal.Items.Add( new GListBoxItem("Image 1",0));
listBoxTotal.Items.Add( new GListBoxItem("Image 2",1));
så syns TEXTEN
Lägger jag denna innan(som du):
this.Controls.AddRange(new System.Windows.Forms.Control[]
{this.listBoxTotal});
Då blir min listbox helt brunfärgad, ingenting syns längre.
Du har kämpat väl med mig, men det verkar som om jag inte skall få mina iconer...
Laddar jag:
listBoxTotal.Items.Add( new GListBoxItem("Image 1",0));
listBoxTotal.Items.Add( new GListBoxItem("Image 2",1));
så syns TEXTEN
Menar du bara texten? Har du lagt in ikoner i din imagelist?
Lägger jag denna innan(som du):
this.Controls.AddRange(new System.Windows.Forms.Control[]
{this.listBoxTotal});
Då blir min listbox helt brunfärgad, ingenting syns längre.
I designläge eller även vid körning?
Men som sagt det är svårt att svara utan att se hela projektkoden (inkl. de autogenererade sektionerna). Har du möjlighet att zippa ihop och posta projektet så gör gärna det (kommentera gärna bort specifika saker som databaskod och övrigt som inte går att köra för andra).
Svar: 1
Jo jag har en imagelist och har lagt in ikoner där.
Svar: 2
Nej bara när jag kör.
Jag letar som f-n, misstänker att jag har fått någon "skräpkod" någonstans, kanske är det just det som gör felet.
OK, då har jag zippat filen, och laggt den här.
Någonstans så har /gör jag fel, för när jag "lekte" med din app. inga som helst problem, men på min!!
Vad jag skall ha iconerna till, är att jag vill kolla mot databasen om kunden fått en cd, isf så skall en icon för cd dyka upp, annars ingenting.
Vad jag har upptäckt är detta:
När jag lägger in private GListBox lb; så får jag problem error menar att lb redan finns i form1(frmKunder).
Jag vore väll inte så förvånad om du direct hittar felet(n), jag är ju nybörjare på det här.
Jag vore väll inte så förvånad om du direct hittar felet
Eh, jo .. riktigt så telepatisk är jag inte. Allvarligt talat, jag har ingen möjlighet att köra din kod. Dels så saknar jag en massa lib/klasser som du använder (labelgradient, wildgrape mm ..). Dels hittar jag ingen definition av dina GlistBox och GListBoxItem (har du dem förkompilerade i namespacet listcontrols?).
Så summa summarum: Vad jag än hittar på i din kod så blir det rena gissningsleken eftersom jag inte kan kompilera utan att lägga ner en massa extra-tid, tyvärr. Så istället får du en step-by-step för en ny listbox.
1. Dra ut en listbox på formuläret.
2. Döp om den till "dinListBox".
3. Ändra i den auto-genererade formulärkoden från:
private System.Windows.Forms.ListBox dinListBox;
till:
private listcontrols.GListBox dinListBox;
och från
this.dinListBox = new System.Windows.Forms.ListBox.GListBox();
till:
this.dinListBox = new listcontrols.GListBox();
4. I formulärets Load-event skriver du:
this.dinListBox.ImageList=imageList1;
5. Sen placerar du kod i stil med:
dinListBox.Items.Add( new listcontrols.GListBoxItem("Image 1",0));
i de events där du vill ha dem (SelectedIndexChanged tex).
Gör du bara exakt så varje gång du skapar en listbox/combobox så kommer det att funka. (Du kommer att se ett felmeddelande i listboxen under design-läget, men det spelar ingen roll när du sen kör koden.)
(Jag förutsätter också att du ändrat imageList till _myImageList i definitionen av GListBox som jag skrev ovan.)
Ok det ser vi ut som lätt som en plätt.
Jag är ju dig evigt tacksam, men du blir nu besviken.
E:\C#\SAW\SAW\frmKunder.cs(94): The type or namespace
name 'Listcontrols' could not be found (are you missing a using
directive or an assembly reference?)
Jag har alltså gjort precis som du har beskrivit och jag får detta medelande, och ingen synlig listbox.
I bland så är det inte särskillt kul...
Jag har alltså gjort precis som du har beskrivit
Inte exakt, faktiskt. C# är känsligt för små/stora bokstäver. Jag chansade på att GListBox och GListBoxItem låg i ett namespace som heter listcontrols (litet "l") eftersom det fanns en saknad referens som hette just så.
Typ:
namespace listcontrols
{
public class GListBoxItem
{
//Kod för GListBoxItem
}
// GListBox class
public class GListBox : ListBox
{
//Kod för GListBox
}
}
Heter namespacet nåt annat så får du ändra därefter.
Niko.
Tack det FUNGERAR....
Bara ett smolk i bägaren, jag kan inte längre se listboxen i designläge. Den försvann så fort som jag kompilerade koden.
Ett annat fel, jag kan inte fånga click-händelsen.
Jag försökte så här:
Innan listboxen(dinListBox) blev osynlig, så dubbelklickade jag på den för att få fram koden får click
private void dinListBox_SelectedIndexChanged(object sender,
System.EventArgs e)
{
UppdateraInfo();
}
Men ingenting händer...
(PS [nu får du int bli förtvivlad] hur skulle man gå till väga om man ville göra detta till en user controll?)
Tack för all din hjälp.