webForumDet fria alternativet

public override string ToString(), på ett objekt

.NET

20 svar · 976 visningar · startad av Mc Fetto

Medlem sedan nov. 20022 355 inlägg
Frågan#1

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 :)

Medlem sedan dec. 2000399 inlägg
#2

Hur ser det objekt du försöker binda ut? Så här?

ArrayList
--- DinArrayList
------ DinaObjekt

Medlem sedan nov. 20022 355 inlägg
#3

-- 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().

Medlem sedan maj 20012 812 inlägg
#4

Det är inte din "Collection klass" som du skall ha override på utan de klasser som du lagrar i din collection klass.

- M

Medlem sedan nov. 20022 355 inlägg
#5

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

Medlem sedan maj 20012 812 inlägg
#6

Nu hänger jag verkligen inte med.

Så här gör jag i min vardag.

1. En klass som heter SearchItem

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

myComBox.DataSource = mySearchItemCollection;

Det fungerar bra...

- M

Medlem sedan nov. 20022 355 inlägg
#7

Jo, men det är det jag gör, fast jag vill ha flera SearchItemCollection i en arraylist. :)

Medlem sedan maj 20012 812 inlägg
#8

Jo, men det är det jag gör, fast jag vill ha flera SearchItemCollection i en arraylist

Aahhha...

Märkligt att det inte fungerar med override på din "searchItemCollection"...

- M

Medlem sedan juni 2004533 inlägg
#9

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.

Medlem sedan nov. 20022 355 inlägg
#10

Guffa skrev:

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".

Medlem sedan juni 2004533 inlägg
#11

Hur hämtar du ut dina SearchItem ur varje SearchItemCollection, då?

Medlem sedan nov. 20022 355 inlägg
#12

Finns inga searchitem på det sättet, det ända är searchitemcollection som ärver av arraylist och som även innehåller lite andra propertys.

Medlem sedan maj 20012 812 inlägg
#13

Jag har testat och hade inga problem med att fylla en combox i ett winform och där skriva ut det som stop i ToString() methoden

.
.
.
		private void Init()
		{
			System.Collections.ArrayList arrayList = new ArrayList();

			arrayList.Add(new SearchItemCollection());
			arrayList.Add(new SearchItemCollection());
			arrayList.Add(new SearchItemCollection());
			arrayList.Add(new SearchItemCollection());
			arrayList.Add(new SearchItemCollection());

			comboBox1.DataSource = arrayList;

		}
	}

	public class SearchItemCollection : System.Collections.ArrayList
	{
		public override string ToString()
		{
			return "Magnus rules";
		}
	}

Gav mig ett winform med en combox där det fanns några "Magnus rules" element. Så du måste göra något annat konstigt.

- M

Medlem sedan maj 20012 812 inlägg
#14

Här kommer förresten bildbevis :)

magnusrules.gif
Medlem sedan nov. 20022 355 inlägg
#15

Gladh skrev:

Här kommer förresten bildbevis :)

:) Tack för beviset, det fungerar ju fint för mig med på andra ställen. Ska ta en titt på det på måndag igen.. återkommer :bire

Medlem sedan nov. 20022 355 inlägg
#16

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 :(

Medlem sedan nov. 20022 355 inlägg
#17

Ingen som har någon bra idé på vad det kan vara. Kör .NET 2.0 men det känns inte som det borde vara en bugg.

Medlem sedan nov. 20022 355 inlägg
#18

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.

Medlem sedan nov. 20022 355 inlägg
#19

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).

Medlem sedan dec. 19996 721 inlägg
#20

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.

272 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)