Jag har ett objekt som ärver av ArrayList och i detta objekt kör jag följande:
public override string ToString()
{
return _description;
}
Detta för att kunna fylla en annan arraylist med obekten och sedan binda dem till en combobox. Problemet är det att i comboboxens fäls syns endast "(collection)" och inte _description från objekten. Detta fungerar på andra objekt vilket förbryllar mig. public overrid "kör" väl över alla andra ToSting() i basklasser mm? Ideer på vad felet kan vara är tacksamma :)
-- arraylist "list": som binds mot comboboxen
-- "list" innehåller objekt som ärver av ArrayList och har egna attribut med. I denna class kör jag överridningen av ToString().
Nu hänger jag inte med riktigt, jag har följande klass som sedan hämtas upp och läggs i en arraylist:
public class SearchItem : ArrayList
{
private string _descritpion;
..
public SearchItem()
{
}
public override string ToString()
{
return _description;
}
}
Alltså har jag i slutändan en arraylist i användargränssnittet som innehåller SearchItem vars _description ska skrivas ut i combon. Hur ska jag då göra? :q
public class SearchItem{
private string _Description;
public string Description{
get{return _Description;}
}
public override string ToString(){
return _Description;
}
public SearchItem(){}
}
2. Sedan har jag en SearchItemCollection klass
public class SearchItemCollection : ArrayList{
.
.
.
}
När jag sedan använder mig av SearchItem så lägger jag till de i min SearchItemCollection vilket gör att jag kanske har 10 olika SearchItem som finns i min SearchItemCollection klass.
När jag sedan vill visa innehållet i min SearchItemCollection så binder jag den klassen mot en dropdownlista/combobx
När du hämtar ut din referens ifrån ArrayList-objektet så är det en referens till ett object av typen Object. Du måste typa om referensen till en searchItemCollection-referens för att den ska använda searchItemCollection.ToString istället för Object.ToString.
När du hämtar ut din referens ifrån ArrayList-objektet så är det en referens till ett object av typen Object. Du måste typa om referensen till en searchItemCollection-referens för att den ska använda searchItemCollection.ToString istället för Object.ToString.
Jag antar att detar att det ar det jag gor nar jag kor en foreach searchitemcollection in "arrayList".
Lustigt, nu när jag tittat på det igen så kollar jag av hur det ser ut i min foreach-sats. I debugläget så ser man att sic.ToString() är satt till "Testsök", vilket är korrekt. Men lik förbannat så blir det som beskrivits i första inlägget :(
Om jag tar bort arvet till ArrayList på mitt objekt så returnerar den description som hämtas ur överridningen av ToString(). Hur ska jag göra för att få rätt på det hela?
Här kommer kodex:
public class SearchItemCollection : ArrayList
{
public SearchItemCollection() { }
public string _description;
public override string ToString()
{
return _description;
}
}
Och användargränssnittet:
SearchItemCollection sic1 = new SearchItemCollection();
sic1.Description = "ett";
SearchItemCollection sic2 = new SearchItemCollection();
sic2.Description = "två";
SearchItemCollection sic3 = new SearchItemCollection();
sic3.Description = "tre";
ArrayList arr = new ArrayList();
arr.Add(sic1);
arr.Add(sic2);
arr.Add(sic3);
for (int i = 0; i < arr.Count; i++)
{
SearchItemCollection sic = (SearchItemCollection)arr[i];
comboBox1.Items.Add(sic);
}
Denna koden skapar tre objekt i comboboxen som visar "(Collection"). Tar jag som jag skrev ovan bort arvet av ArrayList så skrivs ett, två tre ut.
Klipp och klistrade Gladhs kod och fick samma resultat som jag tidigare fått (ifs inte oväntat då det var samma som den jag pressenterade i förra inlägget).
Det här tål att forskas vidare i, men faktum är att det verkar vara en bugg (eller redesign). .NET 2.0 beter sig faktiskt annorlunda när det gäller detta.
Om du vill lösa själva problemet så rekommenderar jag att du gör en string-property på din SearchItem ("Description"), och anger den som DisplayMember för comboboxen. Då borde det inte kunna gå snett.
263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e