[C#] Cannot convert type.... Custom classes

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
Allen,

voor het aankomende examen ben ik wat aan het 'prullen' met C#, databanken en klassen :)

Ik weet dat het allemaal heel erg basic is enzo, maar je moet ergens beginnen :)

De databank 'MyDB.mdf' bestaat uit 2 tabellen: Product & ProductType.

ProductType bestaat uit: Id (uniqueIdentifier)*, Naam (nvarchar)
Product bestaat uit: ID *, Naam, Prijs, Type (UniqueIdentifier)

waar product.type en productType.ID een relatie vormen.

vervolgens heb ik een dataset aan het project gekoppeld "ProductDS.xsd" en reeds volgende classen aangemaakt:

ProductType.cs
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace Oefening_1
{
    public class ProductType
    {
        public Guid Id { get;set; }
        public String Naam { get; set; }
        
      public override string ToString()
      {
          return string.Format("{0}",Naam);
      }
    }

    public class ProductTypeList : List<ProductType>
    {     
    }
}





Product.cs

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace Oefening_1
{
    public class Product:ICloneable
    {
        public Guid Id { get; set; }
        public Guid Type { get; set; }
        public string Naam { get; set; }
        public int Prijs { get; set; }

        public void Assign(Product p)
        {
            this.Naam = p.Naam;
            this.Type = p.Type;
        }

        #region ICloneable Members

        public object Clone()
        {
            return this.Clone();
        }

        #endregion
    }

    public class ProductList : List<Product>
    { 
    }


en vervolgens nog een klasse "DBManager.cs"

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using Oefening_1.ProductDSTableAdapters;

namespace Oefening_1
{
    public static class DBManager
    {
        public static ProductTypeList productTypes()
        { 
            var productTypes = new ProductTypeList();
            var adapter = new ProductTypeTableAdapter();
            var dataset = new ProductDS();

            adapter.Fill(dataset.ProductType);
            adapter.Dispose();

            foreach (ProductDS.ProductTypeRow row in dataset.ProductType.Rows)
            {
                productTypes.Add((ProductType)row);
            }

            return productTypes;
        }

   }
}


Nu krijg ik bij bovenstaand rood-gekleurde regel volgende error:

Op regel 18 van DBManager.cs krijg ik volgende foutmelding:

Cannot convert type 'oefening_1.ProductDS.ProductTypeRow' to 'Oefening_1.ProductType'.

Na enig gevloek en gezoek met de ICloneable dacht ik dat het ging werken, maar tevergeefs....

Heb al in de dataset-code gekeken naar welk type er verwacht wordt, de overige klassen nagekeken e.d. maar kan niets terug vinden...

Iemand die me in de goeie richting kan sturen?

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • denyos
  • Registratie: Februari 2004
  • Laatst online: 17:15
Je probeert een row te casten naar een product. Misschien moet je proberen om de waarde van de regel te casten ;)

edit: Opmerking van boeboe is ook wel een mooie fout inderdaad ware het niet dat het een gewone list is...

[ Voor 33% gewijzigd door denyos op 13-05-2009 14:50 ]

Strava


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

*edit* ha, overzichtelijke code nu
Je moet een producttype adden, geen datarow.

Het is gokken wat de constructor allemaal kan, maar werkt dit niet?

C#:
1
2
ProductType type = new ProductType(row);
productTypes.Add(type);


is productype.cs de volledige klasse? dan zal mijn voorbeeld niet werken. Je gaat in ieder geval data van je row in een nieuw ProductType object moeten steken en daarmee kan je dan productTypes.Add gebruiken.

[ Voor 96% gewijzigd door boe2 op 13-05-2009 14:58 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
[quote]Boeboe schreef op woensdag 13 mei 2009 @ 14:48:
maar probeer eens productTypes.Rows.Add ipv productTypes.Add.
[/quote]

Kan je productTypes.add niet gebruiken vermits het hier om een "gewone" list gaat?

@Denyos: Ben nog niet zo thuis in het hele klassen gebeuren e.d. misschien diepere uitleg over het "casting" gebeuren in dit geval? heb al alle mogelijkheden achter ((procuttype)row. xxxxx) gezet (waar xxxxx = intellisense ;) )

[ Voor 0% gewijzigd door dj_vibri op 13-05-2009 14:56 . Reden: :p ]

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
Boeboe schreef op woensdag 13 mei 2009 @ 14:48:

is productype.cs de volledige klasse? dan zal mijn voorbeeld niet werken.
inderdaad, volledige klasse :)
was net reactie aan het zetten dat dit in mijn geval niet ging werken vermits ik geen argument in mijn constructor heb (laat staan constructor :) )

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • denyos
  • Registratie: Februari 2004
  • Laatst online: 17:15
Een constructor heb je altijd, of je die zelf hebt aangemaakt is iets anders, maar op de achtergrond wordt er altijd een argumentlose constructor aangemaakt. Kijk eens wat voor mogelijkheden je hebt als je row[0].xxxx doet met intellisense ivp row.xxxx . Zal me niks verbazen als je daar een veldnaam/nummer van de plek in je rij kan gaan opgeven, en dan de waarde wel kan uitlezen.

[ Voor 3% gewijzigd door denyos op 13-05-2009 15:02 ]

Strava


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
Wanneer ik het volgende probeer:

C#:
1
productTypes.add((ProductType)row[0].xxxx);


heb ik slechts 4 intellisense waarden: Equals, GetHashCode,GetType,ToString
geen veldnamen dus....

Volgens mij ben ik ergens volledig de mist aan het ingaan...

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:13
Je kan een DataRow niet zomaar casten naar je ProductType class. Je zult zelf expliciet een instantie van die class moeten maken.
C#:
1
2
3
4
ProductType p = new ProductType();
p.Id = row[0].Id;
p.Name = row[0].Name;
// Add to list
dj_vibri schreef op woensdag 13 mei 2009 @ 15:06:
Wanneer ik het volgende probeer:

C#:
1
productTypes.add((ProductType)row[0].xxxx);


heb ik slechts 4 intellisense waarden: Equals, GetHashCode,GetType,ToString
geen veldnamen dus....

Volgens mij ben ik ergens volledig de mist aan het ingaan...
Kijk eens in de gegenereerde code van je dataset, of die popeprties wel gegenereerd zijn? Zo niet dan is er inderdaad iets mis.

[ Voor 51% gewijzigd door sig69 op 13-05-2009 15:12 ]

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • denyos
  • Registratie: Februari 2004
  • Laatst online: 17:15
Wat krijg je terug als je dan die ToString aanroept bij row[0], dus row[0].ToString()?

Strava


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
sig69 schreef op woensdag 13 mei 2009 @ 15:10:
Kijk eens in de gegenereerde code van je dataset, of die popeprties wel gegenereerd zijn? Zo niet dan is er inderdaad iets mis.
hmm... volgens mij staat hier iets te weinig in....

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace Oefening_1 {
    
}

namespace Oefening_1.ProductDSTableAdapters {
    
    
    public partial class ProductTableAdapter {
    }
}

    namespace Oefening_1.ProductDSTableAdapters {
    
    
    public partial class ProductTypeTableAdapter {
    }
}

namespace Oefening_1 {   
    
    public partial class ProductDS {
    }
}

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • Plekuz
  • Registratie: September 2002
  • Laatst online: 23-07 21:42

Plekuz

available in strong mint

dj_vibri schreef op woensdag 13 mei 2009 @ 15:06:
Wanneer ik het volgende probeer:

C#:
1
productTypes.add((ProductType)row[0].xxxx);


heb ik slechts 4 intellisense waarden: Equals, GetHashCode,GetType,ToString
geen veldnamen dus....

Volgens mij ben ik ergens volledig de mist aan het ingaan...
Als row[0] gecast kan worden naar ProductType dan mis je een paar haakjes om de ProductType velden te krijgen na de punt. Je zou het dan als volgt kunnen doen (hoewel alles in 1 regel proppen niet echt fraai is):
C#:
1
productTypes.add(((ProductType)row[0]).xxxx);


Maar het lijkt me wat vreemd dat je een property van het producttype row[0] object wil toevoegen aan een lijst met producttypen.

[ Voor 3% gewijzigd door Plekuz op 13-05-2009 15:27 ]

"There he goes. One of God's own prototypes. Some kind of high powered mutant never even considered for mass production. Too weird to live, and too rare to die."


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:13
Je hebt de dataset gemaakt door een dataset aan je project toe te voegen en dan de twee tabellen vanuit de Server Explorer erop te slepen mag ik hopen? Staan je velden er wel als je je dataset in de designer opent?

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
sig69 schreef op woensdag 13 mei 2009 @ 15:20:
Je hebt de dataset gemaakt door een dataset aan je project toe te voegen en dan de twee tabellen vanuit de Server Explorer erop te slepen mag ik hopen? Staan je velden er wel als je je dataset in de designer opent?
Afbeeldingslocatie: http://img8.imageshack.us/img8/4755/designerq.th.jpg

en inderdaad, dataset aangemaakt en vervolgens de tabellen gesleept....

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
Weakling schreef op woensdag 13 mei 2009 @ 15:20:

Maar het lijkt me wat vreemd dat je een property van het producttype row\[0] object wil toevoegen aan een lijst met producttypen.
Bedoeling van het klein programma'tje is dat er op de main form aan de linkerkant een 'listbox' komt met alle product-types in (zuivel, Vleeswaren, Groenten,...) en wanneer je een producttype selecteert komen de verschillende producten in de rechterkant te voorschijn voor dit product-type ...

rare uitleg, maar hoop dat je begrijpt wat ik bedoel.... :) 8)7

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:13
Als je in de solution explorer de dataset selecteert, staat er dan in de properties bij Custom Tool "MSDataSetGenerator"? Klik dan eens met rechts op de dataset, en dan "Run Custom Tool". Dan zou alle code opnieuw gegenereerd moeten worde en zouden alle classes en dergelijke netjes in je [datasetname].designer.cs moeten staan. Je evenetueel even een tabel een stukje verslepen om 'm te "forceren" (wil nog wel eens helpen).

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
sig69 schreef op woensdag 13 mei 2009 @ 17:01:
Als je in de solution explorer de dataset selecteert, staat er dan in de properties bij Custom Tool "MSDataSetGenerator"? Klik dan eens met rechts op de dataset, en dan "Run Custom Tool". Dan zou alle code opnieuw gegenereerd moeten worde en zouden alle classes en dergelijke netjes in je [datasetname].designer.cs moeten staan. Je evenetueel even een tabel een stukje verslepen om 'm te "forceren" (wil nog wel eens helpen).
morgen eens proberen, alvast merci!!!

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
en voor beetje tijdverdrijf toch nog maar eens opnieuw geprobeerd, van nul af aan te beginnen weliswaar.

en kom tot de volgende vaststelling:

- Foutmelding komt terug
- wanneer ik via intellisense het volgende probeer:

C#:
1
ProductTypes.Add((ProductType)row.xxxxxx);


krijg ik deze keer veeeeeel meer mogelijkheden...

Heb het net eens aan docent gevraagd en hij verteld me het volgende: 'ahjaaa, je moet nog een conversie-operator op je rij laten lopen'

euh.... oke, enige hulp mss?!?
antwoord docent: search search search :d :)

Maar wanneer ik bv: .tostring() erachter plaats krijg 'k error, plaats ik er bv. .naam.tostring() achter ook error....

Iemand enig idee? *zoek ondertussen nog wel zelf verder*

thxn in advance!

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • DutchCommando
  • Registratie: November 2000
  • Laatst online: 19:20
denyos schreef op woensdag 13 mei 2009 @ 15:02:
Een constructor heb je altijd, of je die zelf hebt aangemaakt is iets anders, maar op de achtergrond wordt er altijd een argumentlose constructor aangemaakt.
Dit klopt zolang je zelf niet een constructor gedefinieerd hebt.

Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
eventjes een update:

C#:
1
TypeList.Add((ProductType)row[1])


geeft geen compile fouten, maar bij het debuggen krijg ik volgende melding:

Unable to cast object of type 'System.String' to type 'Oefening_1.Classes.ProductType

*zucht*

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • denyos
  • Registratie: Februari 2004
  • Laatst online: 17:15
in row veld [1] zit een waarde van het type string. achter dat row[1].ToString() zetten. Kijk wat hier voor waarde uitkomt. Alleen hieruit! Dus niet proberen toe te wijzen aan je eigen object, maar gewoon eerst eens kijken wat er daadwerkelijk in het object zit. Tevens gaat bij alleen de melding "dat geeft een error" bij mij geen lichtje branden... iets meer duidelijkheid is dus wenselijk want niemand hier heeft een glazenbol waarmee ze het kunnen zien.

[ Voor 20% gewijzigd door denyos op 13-05-2009 21:21 ]

Strava


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
denyos schreef op woensdag 13 mei 2009 @ 21:19:
Tevens gaat bij alleen de melding "dat geeft een error" bij mij geen lichtje branden... iets meer duidelijkheid is dus wenselijk want niemand hier heeft een glazenbol waarmee ze het kunnen zien.
Vandaar dus de vorige post met de foutmelding :) *Mijn excuses voor het niet duidelijk uitleggen*

Nu heb ik het volgende geplaatst in code, zonder fouten gecompiled en vervolgens gaan debuggen:

C#:
1
TypeList.Add((ProductType)row[1]);


wanneer ik vervolgens een watch plaats als volgt:

code:
1
row[1].tostring()


krijg ik als waarde: "Zuivel " terug, een string waarde.

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • mindcrash
  • Registratie: April 2002
  • Laatst online: 22-11-2019

mindcrash

Rebellious Monkey

Uhm, je weet dat er een fantastische debugger in Visual Studio zit?

Even een breekpuntje zetten op het entry point van je app en vervolgens kun je door de code heen stappen en via hulpmiddelen zoals watches en visualizers e.d. kijken wat er allemaal 'in de achtergrond' gebeurt.

[ Voor 15% gewijzigd door mindcrash op 13-05-2009 21:36 ]

"The people who are crazy enough to think they could change the world, are the ones who do." -- Steve Jobs (1955-2011) , Aaron Swartz (1986-2013)


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
I've found it!

Oplossing:

In de DataSet codefile heb ik het volgende toegevoegd:

C#:
1
2
3
4
5
6
7
8
9
10
11
         partial class TblProductTypeRow
        {
             public static explicit operator ProductType(TblProductTypeRow row)
             {
                return new ProductType()
                {
                Naam = row.Naam,
                ID = row.ID                
                };
             }
        }


en in de DBManager.cs exact zoals ik het in het begin had:

C#:
1
2
3
4
            foreach (ProductDS.TblProductTypeRow row in dataset.TblProductType)
            {                
                TypeList.Add((ProductType)row);
            }


toch thxn voor de hulp!

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • denyos
  • Registratie: Februari 2004
  • Laatst online: 17:15
Je weet ook wat je nu doet?
had je net namelijk row["Naam"].ToString() gedaan, dan had je er al eerder achter gekomen. Zelfde met row[0].ToString(). Daarnaast is de tip van mindcrash ook wel handig om even iets verder in te verdiepen, want dit was zeer snel te achterhalen door met de debugger even wat dingetjes te proberen zoals die ToString() die we meerdere malen genoemd hebben.
Neemt natuurlijk niet weg dat het positief is dat je het opgelost heb gekregen :)

Strava


Acties:
  • 0 Henk 'm!

  • dj_vibri
  • Registratie: Oktober 2007
  • Laatst online: 16-09 17:16

dj_vibri

int(e^x) = f(u)^n

Topicstarter
:/ :? zal eens moeten googlen denk ik :)

Last night I lay in bed looking up at the stars in the sky and I thought to myself, where the heck is the ceiling.


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 15:13
denyos schreef op woensdag 13 mei 2009 @ 22:32:
Neemt natuurlijk niet weg dat het positief is dat je het opgelost heb gekregen :)
Alleen jammer dat ie totaal niet snapt wat hij fout deed, en wat de oplossing nu eigenlijk doet..

Roomba E5 te koop

Pagina: 1