Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

Linq en C#

Pagina: 1
Acties:

  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Hallo tweakers, ik zit nu in het 2e jaar van MBO applicatiieontwikkeling, en probeer op stage iets simpels te maken om te leren werken met Linq.

Ik heb nu een basis windows forms application en heb hem gelinkt aan mijn SQLEXPRESS database. Het is een simpel tooltje die zou moeten helpen met een spel.
Wat ik nu wil is dat ik in de combobox de naam selecteer en dat er in een label een bijbehorende tekst komt.

In de combobox selecteer ik "naam" (dat werkt al)
Ik wil vervolgens in de label de tijd hebben die bij de naam uit de database hoort. Ik ben al een uurtje of 2 aan het googlen en heb helaas nog niks gevonden wat me kan helpen.

Zou een van jullie me de goede richting in willen helpen :)? Je hoeft het niet helemaal voor te zeggen, want ik hou ervan het zelf uit te zoeken, heb er ook erg veel plezier in :-)

Edit1:

Code voor de eerste knop (haalt data uit database en zet hem in de combobox)
"
private void button2_Click(object sender, EventArgs e)
{
comboBox1.DataSource = db.Farm_Herbs.ToList();
comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "HerbName";
}
"

En ik wil dan een 2e knop die de tijd zoekt die bij die naam hoort.

Edit2: Dit staat bovenaan in de code:

"
public partial class Form1 : Form
{
DomiEntities db = new DomiEntities();
Farm_Herbs herb = new Farm_Herbs();
"

[ Voor 26% gewijzigd door Domih op 16-09-2014 15:03 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


Verwijderd

Kan je een stukje van je code posten?

  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Verwijderd schreef op dinsdag 16 september 2014 @ 15:01:
Kan je een stukje van je code posten?
Staat toegevoegd :) Mijn kennis is heel erg basis, dus hoop dat iemand kan helpen, wil het graag leren!

[ Voor 19% gewijzigd door Domih op 16-09-2014 15:04 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


Verwijderd

Gebruik je een bepaald framework (Entity Framework, NHibernate, etc) of gewoon pure ADO.Net? (System.Data)

  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Oh ik gebruik Entity Framework (Dat moet ik leren om voor mijn stage webapplicaties te kunnen maken)

Ik had eerder zoiets, maar dan komt er iets heel vreemds:

private void button3_Click(object sender, EventArgs e)
{
string herbname = comboBox1.Text;
var time =
from n in herb.HerbName
select herb.TimeInMin;

label1.Text = time.ToString();
}

Wat ik eigenlijk wil weten is hoe het heet wat ik wil doen, want kan het echt niet vinden op google :/

[ Voor 73% gewijzigd door Domih op 16-09-2014 15:10 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


Verwijderd

Als ik heb goed begrijp is db.Farm_Herbs van het type IQueryable<Farm_Herbs>.

Hier zou je dan zoiets kunnen doen:

C#:
1
var herb = db.Farm_Herbs.FirstOrDefault(h => h.ID == int.Parse(comboBox1.SelectedValue));



Maar gezien je een WinForm gebruikt is het geselecteerde item in je Combobox van het type object...

C#:
1
var herb = comboBox1.SelectedItem as Fram_Herb;


Na beide voorbeelden kan je simpel dit doen:

C#:
1
2
3
4
if(herb != null)
{
label1.Text = herb.TimeInMin.ToString();
}

[ Voor 16% gewijzigd door Verwijderd op 16-09-2014 15:16 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 17:28

Dido

heforshe

Domih schreef op dinsdag 16 september 2014 @ 15:05:

from n in herb.HerbName
select herb.TimeInMin;
Dat gaat sowieso niet werken.
code:
1
2
from n in herb
                select n.TimeInMin;

Gaat al een stuk meer doen. Realiseer je wel dat je hiermee alle TimeInMins ophaalt, dus je wilt er waarschijnlijk nog iets tussen plakken om de goede n te vinden (where n.herbName == something).

En dan heb je alsnog een IEnumerable, ook al krijg je maar 1 record terug.

Oh, en als je een ID hebt, gebruik het dan ook ;) Dus in plaats van HerbName, gebruik ID om te zoeken :)

Wat betekent mijn avatar?


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Oke bedankt allebei, ik ga weer even knutselen voor zover ik kan :P Denk dat ik vandaag een uurtje langer doorwerk haha
Realiseer je wel dat je hiermee alle TimeInMins ophaalt
Nope dat realiseer ik me niet, dat is hoe weinig ik ervan snap :P

[ Voor 38% gewijzigd door Domih op 16-09-2014 15:22 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Ik heb nu dit, en heb het idee dat het dichter in de buurt komt:
code:
1
2
3
4
            var time =
            from n in herb.HerbName
            where herb.HerbName == comboBox1.DisplayMember
            select herb.TimeInMin;

Edit: Nope, de "HerbName" is null.. hmm

Weer geedit, nu is herb.HerbName de value die ik pak in de combobox!
Nu alleen nog de bijbehorende tijd vinden, waar ik dus geen idee van heb hoe..
code:
1
2
3
4
5
            herb.HerbName = comboBox1.Text;
            var time =
            from n in herb.HerbName
            where herb.HerbName == comboBox1.DisplayMember
            select herb.TimeInMin;

[ Voor 50% gewijzigd door Domih op 16-09-2014 15:32 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


Verwijderd

Zoals Dido aangaf moet je niet gaan vergelijken op de naam, maar op het Id van je tabel.

Dat is a. sneller en b. uniek. Het zou zo maar eens voor kunnen komen dat 2 items met dezelfde naam bestaan.
Daarbij is DisplayMember niet de property die je uit wil lezen hier.

C#:
1
2
3
4
5
6
7
8
var herb = (from herb in db.Farm_Herbs
where herb.ID == int.Parse(comboBox1.SelectedValue)
select herb).FirstOrDefault();
if(herb != null)
{
var time = herb.TimeInMin;

}

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 10-11 15:18
Domih schreef op dinsdag 16 september 2014 @ 15:25:
Ik heb nu dit, en heb het idee dat het dichter in de buurt komt:

C#:
1
2
3
4
var time =
            from n in herb.HerbName
            where herb.HerbName == comboBox1.DisplayMember
            select herb.TimeInMin;


Edit: Nope, de "HerbName" is null.. hmm
Het gaat volgens mij mis dat je in het object herb.HerbName al selecteerd in de from gedeelte. Wat je in de eerste regel doet is, van de collectie herb.HerbName, noem die n, en ga daar mee verder. Dit zou beter moeten werken:

C#:
1
2
3
4
5
6
var time =
            from n in herb
            where n.HerbName == comboBox1.DisplayMember
            select n.TimeInMin;

var value = time.First();


Lees je in op de collecties van LINQ: LINQ 101, hier zie je wat linq doet :)

offtopic:
als je de tags [code=c#]Hier je code[/code] gebruikt dan komt het netjes in een code blok te staan.

Verwijderd

Alleen is herb niet een collectie maar een class-level variabel. (Zie TS).
De collectie is db.Farm_Herbss. Hij zit met zijn from n in herb.HerbName in een string (char array) te zoeken.

[ Voor 3% gewijzigd door Verwijderd op 16-09-2014 15:41 ]


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Het gaat volgens mij mis dat je in het object herb.HerbName al selecteerd in de from gedeelte. Wat je in de eerste regel doet is, van de collectie herb.HerbName, noem die n, en ga daar mee verder. Dit zou beter moeten werken:
C#:
Hallo, bedankt voor je reactie :)

Die linq 101 had ik me al een beetje op ingelezen.
Ik wil het echter in de praktijk werkend zien, dus maak ik een eigen klein "projectje" wat altijd lastiger blijkt te zijn dan ik dacht..

Als ik jouw code pak krijg ik steeds de melding ' "Where" not found'

Deze melding:
"Error 1 Could not find an implementation of the query pattern for source type 'Test.Farm_Herbs'. 'Where' not found. c:\users\developer6.develop-pc\documents\visual studio 2012\Projects\Test\Test\Form1.cs 53 27 Test
"

[ Voor 63% gewijzigd door Domih op 16-09-2014 15:51 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Hij doet het nu met deze code, heel erg bedankt!!!:
code:
1
2
3
4
5
6
7
8
            List<Farm_Herbs> herb = db.Farm_Herbs.ToList();
            var time =
                from n in herb
                where n.HerbName == comboBox1.Text
                select n.TimeInMin;
            var value = time.First();

            label1.Text = value.ToString();



Ik weet alleen niet wat
code:
1
var value = time.First();
doet

Iemand die mij dat uit kan leggen?

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


Verwijderd

Domih schreef op dinsdag 16 september 2014 @ 16:05:
Hij doet het nu met deze code, heel erg bedankt!!!:
code:
1
2
3
4
5
6
7
8
            List<Farm_Herbs> herb = db.Farm_Herbs.ToList();
            var time =
                from n in herb
                where n.HerbName == comboBox1.Text
                select n.TimeInMin;
            var value = time.First();

            label1.Text = value.ToString();
Twee dingen.
List<Farm_Herbs> herb = db.Farm_Herbs.ToList(); is fout.
db.Farm_Herbs is al een IEnummerable<Farm_Herbs>, en kan dus direct in de LINQ query geplaatst worden.

2. Je zoekt nog steeds dmv de naam. Zoals we al herhaaldelijk aangegeven hebben is dat niet verstandig.
Ik weet alleen niet wat
code:
1
var value = time.First();
doet

Iemand die mij dat uit kan leggen?
First() pakt het eerste element in en IEnummerable.

  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Verwijderd schreef op dinsdag 16 september 2014 @ 16:10:
[...]


Twee dingen.
List<Farm_Herbs> herb = db.Farm_Herbs.ToList(); is fout.
db.Farm_Herbs is al een IEnummerable<Farm_Herbs>, en kan dus direct in de LINQ query geplaatst worden.

2. Je zoekt nog steeds dmv de naam. Zoals we al herhaaldelijk aangegeven hebben is dat niet verstandig.


[...]

First() pakt het eerste element in en IEnummerable.
Hallo,

1. Als ik die <list> daarboven weghaal krijg ik de foutmelding die hierboven aangegeven staat.

2. Ik probeer nu inderdaad iets te knutselen om te zoeken op ID, vind ik zelf ook prettiger.

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


Verwijderd

Wat is het type van db.Farm_Herbs? :)

  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Verwijderd schreef op dinsdag 16 september 2014 @ 16:20:
Wat is het type van db.Farm_Herbs? :)
Ik moet eerlijk zeggen dat ik geen idee heb en dat ik niet weet hoe ik dat kan checken.

Sorry dat ik zo'n noob ben :P


Edit: Mijn ID is trouwens van het type Decimal, dat levert ook problemen op

[ Voor 12% gewijzigd door Domih op 16-09-2014 16:24 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


Verwijderd

Dat kan op verschillende manieren. Het makkelijkste is je cursor erachter te zetten en op F12 te drukken. De IDE neemt je dan naar de definitie toe en je ziet ervoor staan wat het type ervan is.

Andere optie is in de popup die je krijgt als je er overheen hovert met je muiscursor :)

en je decimal / double kan je ook parse met decimal.parse of double.parse.

[ Voor 11% gewijzigd door Verwijderd op 16-09-2014 16:28 ]


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10

jvaneijk

Dr.Oak

Hoi Domih,

Ik zal je aanraden eens naar deze website te kijken. Dit is de officiele microsoft website over Entity Framework.

Hier vindt je veel het zelfde als op Linq 101 wat eerder terugkwam maar stukken eenvoudiger uitgelegd.

iRacing Profiel


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Dit staat er dan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
namespace Test
{
    using System;
    using System.Collections.Generic;
    
    public partial class Farm_Herbs
    {
        public decimal ID { get; set; }
        public string HerbName { get; set; }
        public Nullable<int> TimeInMin { get; set; }
    }
}

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10

jvaneijk

Dr.Oak

Ik zal je aanraden om je ID's in de database altijd van het Type Int te maken en het lieft auto increment om er zo zeker van te zijn dat je geen dubelle ID's krijg in je tabel.

iRacing Profiel


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
jvaneijk schreef op dinsdag 16 september 2014 @ 16:34:
Hoi Domih,

Ik zal je aanraden eens naar deze website te kijken. Dit is de officiele microsoft website over Entity Framework.

Hier vindt je veel het zelfde als op Linq 101 wat eerder terugkwam maar stukken eenvoudiger uitgelegd.
Oeh heel erg bedankt! Dat wordt dan mijn opdracht van morgen :P
Het enige probleem dat we hier hebben is dat we alleen maar een 8mbit lijn hebben waar we met zn allen op werken, dus mag geen filmpjes streamen, maar als er niet teveel filmpjes zijn moet t geen probleem zijn :P

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10

jvaneijk

Dr.Oak

Ik zal beginnen met het lezen ipv de filmpjes, die gaan soms wat snel. zeker voor beginner

[ Voor 12% gewijzigd door jvaneijk op 16-09-2014 16:38 ]

iRacing Profiel


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
jvaneijk schreef op dinsdag 16 september 2014 @ 16:36:
Ik zal je aanraden om je ID's in de database altijd van het Type Int te maken en het lieft auto increment om er zo zeker van te zijn dat je geen dubelle ID's krijg in je tabel.
Dat had ik inderdaad toen ik mijn database had gemaakt, het probleem dat ik toen had was dat ik geen dingen aan de database kon toevoegen als er al iets stond met ID 1.

Ik zal het nu proberen te veranderen en kijken wat voor problemen die geeft.

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10

jvaneijk

Dr.Oak

Dat komt omdat je op je ID veld wel de primaire sleutel hebt gezet maar je hem niet auto increment hebt gemaakt wat er dus voor zorgt dat je zelf je ID veld moet vullen. Best practice is om het ID veld door de database te laten vullen zodat je dit soort problemen niet tegenkomt.

iRacing Profiel


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Oke bedankt, hoe kan ik Decimal nu veranderen in Int?

Krijg nu deze foutmelding als ik iets in de db wil plaatsen:
The type 'Edm.Decimal' of the member 'ID' in the conceptual side type 'DomiModel.Farm_Herbs' does not match with the type 'System.Int32' of the member 'ID' on the object side type 'Test.Farm_Herbs'.
auto increment staat nu aan btw.

[ Voor 5% gewijzigd door Domih op 16-09-2014 16:46 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10

jvaneijk

Dr.Oak

Hieronder een mooi voorbeeld van een simpele tabel definitie

SQL:
1
2
3
4
5
6
7
8
CREATE TABLE [dbo].[Actie](
    [ActieID] [int] IDENTITY(1,1) NOT NULL,
    [ActieNaam] [varchar](64) NOT NULL,
 CONSTRAINT [pkActie] PRIMARY KEY NONCLUSTERED 
(
    [ActieID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


Belangrijkste is de ActieID die is van het type int met IDENTITY(1,1) dit zorgt ervoor dat het autoincrement is met een seed van 1 en een stap van 1 ofzo. Makkelijk gezegd hij begint bij 1 te tellen en elk volgend record wordt steeds 1 opgehoogd

Na de constraint moet je even niet meer opletten dit is een beetje code die Managementstudio heeft gecreeerd omdat ik zelf geen zin had om te typen maar het komt hierop neer

SQL:
1
2
3
4
5
CREATE TABLE Herbs (
   ID int IDENTITY(1,1) NOT NULL,
   Name varchar(128) NOT NULL,
   TimeInMinute int NULL
)

iRacing Profiel


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10

jvaneijk

Dr.Oak

Domih schreef op dinsdag 16 september 2014 @ 16:45:
Oke bedankt, hoe kan ik Decimal nu veranderen in Int?

Krijg nu deze foutmelding als ik iets in de db wil plaatsen:


[...]


auto increment staat nu aan btw.
Je moet nooit zomaar je klasse aanpassen in entity framework omdat dit vaak gegenereerde code is. Het beste is om je tabel definitie in ManagementStudio aan te passen (de database dus) dan je EDMX te openen en je entity ..Herbs weg te gooien en dan rechter muisknop op editor update model from database te klikken en je tabel weer te selecteren.

Indien je gebruik maakt van Entity Framework Code First, dan kan je wel de class rechtstreeks aanpassen maar dan moet je met EF code first migrations gaan werken. Dit zal ik je niet aanraden als beginner omdat je hier en daar al wat moeite hebt met de beginsellen.

iRacing Profiel


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Daarin heb ik het nu inderdaad veranderd in mijn SQL Server Management Studio.

Oke ik ga het even proberen!
Heb een backup gemaakt van mijn solution voor het geval ik het compleet verpest :P

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Ik loop nu helemaal vast :(

code:
1
2
3
4
5
6
7
8
9
10
11
        {
            List<Farm_Herbs> herb = db.Farm_Herbs.ToList();
            string timeID = comboBox1.ValueMember.ToString();
            var time =
                from n in herb 
                where n.ID == comboBox1.ValueMember
                select n.TimeInMin;
            var value = time.First();

            label1.Text = value.ToString();
        }


Dat heb ik nu staan, nu krijg ik de error
Error 1 Operator '==' cannot be applied to operands of type 'int' and 'string' C:\Users\Developer6.Develop-PC\Documents\Visual Studio 2012\Projects\Test\Test\Form1.cs 50 23 Test
Een erg duidelijke error, waar de ID gedefineerd stsaat staat dit:
code:
1
2
3
4
5
6
        private void button2_Click(object sender, EventArgs e)
        {
            comboBox1.DataSource = db.Farm_Herbs.ToList();
            comboBox1.ValueMember = "ID";
            comboBox1.DisplayMember = "HerbName";
        }


Ik weet niet zo goed meer wat ik moet doen om hem de tijd te laten zoeken die bij ID past

[ Voor 4% gewijzigd door Domih op 16-09-2014 17:05 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10

jvaneijk

Dr.Oak

Het is misschien slim aangezien je toch met C# werkt en Visual studio waarschijnlijk om een gratis TFS account aan te maken bij Microsoft. Dit is TFS Team Foundation Service (veel gebruikte source control service) net zoiets als SVN / GitHub. Hier kan je een gratis account krijgen

scroll iets naar beneden en klik op Get Started For Free! hier even je LiveID invullen en klaar ben je.

Dan kan je je solution in TFS zetten. Netjes inchecken en branches maken. En hoef je ook niet bang te zijn dat je alles verpest als je dit soort dingen doet.

iRacing Profiel


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10

jvaneijk

Dr.Oak

Domih schreef op dinsdag 16 september 2014 @ 17:05:
Ik loop nu helemaal vast :(

code:
1
2
3
4
5
6
7
8
9
10
11
        {
            List<Farm_Herbs> herb = db.Farm_Herbs.ToList();
            string timeID = comboBox1.ValueMember.ToString();
            var time =
                from n in herb 
                where n.ID == comboBox1.ValueMember
                select n.TimeInMin;
            var value = time.First();

            label1.Text = value.ToString();
        }


Dat heb ik nu staan, nu krijg ik de error

[...]


Een erg duidelijke error, waar de ID gedefineerd stsaat staat dit:
code:
1
2
3
4
5
6
        private void button2_Click(object sender, EventArgs e)
        {
            comboBox1.DataSource = db.Farm_Herbs.ToList();
            comboBox1.ValueMember = "ID";
            comboBox1.DisplayMember = "HerbName";
        }


Ik weet niet zo goed meer wat ik moet doen om hem de tijd te laten zoeken die bij ID past
Als je kijkt naar de melding die gegeven wordt is dat je == aanroept op iets wat een string is aan de ene kant maar je ID is een int. dit vergelijking mag niet.

Daarnaast moet je ook niet je ValueMember van de Combobox pakken. Dit is namelijk een property op je combobox die ervoor zorgt dat je bepaalde string opgeeft met de naam van je property welke moet dienen als de value van je option in je select.

als jij ComboBox1.ValueMember = "ID" opgeeft dan zeg je dus dat je ID in je lijst met items moet gebruiken als value.

Zelfde geld voor je DisplayMember dit is de zichtbare text.

Wat je moet doen is je ComboBox1.SelectedValue parsen naar een int en dit tegen je linq query aanhouden bjvoorbeeld zo:

code:
1
2
3
4
5
6
7
8
9
10
11
        {
            List<Farm_Herbs> herb = db.Farm_Herbs.ToList();
            int timeID = int.Parse(comboBox1.SelectedValue);
            var time =
                from n in herb 
                where n.ID == timeID
                select n.TimeInMin;
            var value = time.First();

            label1.Text = value.ToString();
        }


Let goed op de kleine verschillen. ten opzichte van jouw code. Beter is het om de TryParse te gebruiken om er zeker van te zijn dat de Selectedvalue echt van het type int is

Beter nog:

C#:
1
2
3
4
5
6
7
int timeID; // standaard wordt dit 0
if(int.TryParse(comboBox1.SelectedValue.ToString(),out timeID);
{
Farm_Herbs herb = db.Farm_Herbs.FirstOrDefault(fh=>fh.ID == timeID);
string value = herb.TimeInMin.ToString();
label1.Text = value;
}


Mijn excuses voor de opmaak maar doe dit uit mijn hoofd zonder visual studio dus kan hier en daar een foutje inzitten.

[ Voor 7% gewijzigd door jvaneijk op 16-09-2014 17:22 ]

iRacing Profiel


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
jvaneijk schreef op dinsdag 16 september 2014 @ 17:09:
Het is misschien slim aangezien je toch met C# werkt en Visual studio waarschijnlijk om een gratis TFS account aan te maken bij Microsoft. Dit is TFS Team Foundation Service (veel gebruikte source control service) net zoiets als SVN / GitHub. Hier kan je een gratis account krijgen

scroll iets naar beneden en klik op Get Started For Free! hier even je LiveID invullen en klaar ben je.

Dan kan je je solution in TFS zetten. Netjes inchecken en branches maken. En hoef je ook niet bang te zijn dat je alles verpest als je dit soort dingen doet.
Daar ga ik niet aan beginnen, ik werk namelijk op mijn stage op de developer PC, en daar staat al TFS op met alle belangrijke projecten van het bedrijf, ben heel bang dat dat gaat conflicteren. Ik zou op mijn PC lokaal kunnen werken, dan zou ik daar ook SQLEXPRESS op moeten instellen, ik ga morgen even bekijken wat mijn mogelijkheden daarin zijn :) Ik neem aan dat ik altijd naar eerdere versies terug kan gaan met TFS?

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
jvaneijk schreef op dinsdag 16 september 2014 @ 17:16:
[...]


Als je kijkt naar de melding die gegeven wordt is dat je == aanroept op iets wat een string is aan de ene kant maar je ID is een int. dit vergelijking mag niet.

Daarnaast moet je ook niet je ValueMember van de Combobox pakken. Dit is namelijk een property op je combobox die ervoor zorgt dat je bepaalde string opgeeft met de naam van je property welke moet dienen als de value van je option in je select.

als jij ComboBox1.ValueMember = "ID" opgeeft dan zeg je dus dat je ID in je lijst met items moet gebruiken als value.

Zelfde geld voor je DisplayMember dit is de zichtbare text.

Wat je moet doen is je ComboBox1.SelectedValue parsen naar een int en dit tegen je linq query aanhouden bjvoorbeeld zo:

code:
1
2
3
4
5
6
7
8
9
10
11
        {
            List<Farm_Herbs> herb = db.Farm_Herbs.ToList();
            int timeID = int.Parse(comboBox1.SelectedValue);
            var time =
                from n in herb 
                where n.ID == timeID
                select n.TimeInMin;
            var value = time.First();

            label1.Text = value.ToString();
        }


Let goed op de kleine verschillen. ten opzichte van jouw code. Beter is het om de TryParse te gebruiken om er zeker van te zijn dat de Selectedvalue echt van het type int is
Ik krijg nu dus deze foutmelding:
Error 1 The best overloaded method match for 'int.Parse(string)' has some invalid arguments C:\Users\Developer6.Develop-PC\Documents\Visual Studio 2012\Projects\Test\Test\Form1.cs 47 26 Test

Ik ga er even google op los gooien :P

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • jvaneijk
  • Registratie: Mei 2003
  • Laatst online: 29-05 12:10

jvaneijk

Dr.Oak

SelectedValue is van het type object, er moet een string in dus een simpele ToString() na de selectedValue zal voldoende moeten zijn.

iRacing Profiel


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Domih schreef op dinsdag 16 september 2014 @ 17:20:

Ik ga er even google op los gooien :P
Met alle respect, maar als je dat nou eens doet voordat je hier elke scheet foutmelding dumpt. We willen je bést helpen maar we gaan hier niet je handje vasthouden. Vooralsnog kom je hier elke paar minuten een post doen (en dat is dus niet de bedoeling: topickick binnen 24 uur).

Daarbij post je regelmatig 2 keer achter elkaar; gebruik a.u.b. de wijzig-link (rechtsbovenaan je post) als je iets toe te voegen hebt; je topic herhaaldelijk omhoogschoppen (zie vorige link) is dus niet nodig en die melding staat er niet voor niets:

Afbeeldingslocatie: http://tweakers.net/ext/f/rViZSDpQ5n2TpYCcyrDz83Jf/full.png

[ Voor 9% gewijzigd door RobIII op 16-09-2014 17:27 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
jvaneijk schreef op dinsdag 16 september 2014 @ 17:23:
SelectedValue is van het type object, er moet een string in dus een simpele ToString() na de selectedValue zal voldoende moeten zijn.
Hij werkt!!!

Heb nu int.parse(comboBox1.SelevtedValue.ToString());

eerst int.parse, dan .tostring, vind het een beetje krom :P haha

Maar het werkt, ik ga het nu afsluiten en morgen verder en zorgen dat ik via dit scherm kan editen.

Ik ga het eerst weer uren zelf proberen, en misschien dat ik later weer op dit topic ga reageren :)

Heel erg bedankt voor de zeer helpende reacties, erg fijn zo'n cummunity :)

Ik wens jullie allemaal een prettige avond!
Groet,
Dominique
Edit: @ roblll
Ik heb inderdaad mijn best gedaan om zo vaak mogelijk "edit" te gebruiken, maar als ik een reactie gehad heb mag ik daar toch wel weer snel op reageren? Ik ben echt nog een beginner op dit gebied en ik weet zeker da tik nu heel veel geleerd heb.

U ook een fijne avond.

[ Voor 16% gewijzigd door Domih op 16-09-2014 17:28 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Domih schreef op dinsdag 16 september 2014 @ 17:25:
[...]

Hij werkt!!!

Heb nu int.parse(comboBox1.SelevtedValue.ToString());

eerst int.parse, dan .tostring, vind het een beetje krom :P haha
Je doet eerst een toString en dan de toInt.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Domih schreef op dinsdag 16 september 2014 @ 17:25:
Edit: @ roblll
Ik heb inderdaad mijn best gedaan om zo vaak mogelijk "edit" te gebruiken, maar als ik een reactie gehad heb mag ik daar toch wel weer snel op reageren?
Ik doelde hier specifiek op:
  1. Domih in "Linq en C#" met daarna Domih in "Linq en C#"
  2. Domih in "Linq en C#" met daarna Domih in "Linq en C#"
  3. Domih in "Linq en C#" met daarna Domih in "Linq en C#"
  4. Domih in "Linq en C#" met daarna Domih in "Linq en C#"
In elk van die 4 gevallen (8 posts) post je meteen na jezelf zonder dat iemand anders na jou gereageerd heeft. Daarmee schop je je topic telkens onnodig omhoog in de "active topics" lijsten e.d. en dat wordt als vervelend ervaren. Zoals ik zei: Die melding staat er niet voor niets:

Afbeeldingslocatie: http://tweakers.net/ext/f/rViZSDpQ5n2TpYCcyrDz83Jf/full.png


Als er iemand na jou gepost heeft is 't een ander verhaal als je erop reageert; als jij de laatste bent die (minder dan 24 uur geleden) gepost heeft in 't topic dien je gewoon je laatste reactie aan te vullen/wijzigen met de "wijzig-link" (rechtsbovenaan je post) (zoals hier dus ook uitgelegd staat).

[ Voor 16% gewijzigd door RobIII op 16-09-2014 17:45 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Enn ik ben weer een stukje verder :)

Kan nu data editen vanuit het programmaatje, ik weet dat er betere manieren zijn, maar ik heb het zo gedaan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void button2_Click_1(object sender, EventArgs e)
        {
            List<Farm_Herbs> herb = db.Farm_Herbs.ToList();
            string newName = textBox4.Text;
            string newTime = textBox3.Text;
            var NewName = (from x in herb
                            where x.HerbName == label3.Text
                            select x).First();
            NewName.HerbName = textBox3.Text ;
            var NewTime = (from x in herb
                           where x.TimeInMin == int.Parse(label4.Text)
                           select x).First();
            NewTime.TimeInMin = int.Parse(textBox4.Text);
            db.SaveChanges();
            comboBox1.DataSource = db.Farm_Herbs.ToList();
            
        }

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 16:11

Rannasha

Does not compute.

Domih schreef op woensdag 17 september 2014 @ 10:00:
Enn ik ben weer een stukje verder :)

Kan nu data editen vanuit het programmaatje, ik weet dat er betere manieren zijn, maar ik heb het zo gedaan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void button2_Click_1(object sender, EventArgs e)
        {
            List<Farm_Herbs> herb = db.Farm_Herbs.ToList();
            string newName = textBox4.Text;
            string newTime = textBox3.Text;
            var NewName = (from x in herb
                            where x.HerbName == label3.Text
                            select x).First();
            NewName.HerbName = textBox3.Text ;
            var NewTime = (from x in herb
                           where x.TimeInMin == int.Parse(label4.Text)
                           select x).First();
            NewTime.TimeInMin = int.Parse(textBox4.Text);
            db.SaveChanges();
            comboBox1.DataSource = db.Farm_Herbs.ToList();
            
        }
Een paar opmerkingen hierover, vooral over de naamgeving van variabelen. Je hebt nu een variabele "newName" en een variabele "NewName" (idem voor newTime). De eerste van de twee krijgt wel een waarde toegekend, maar wordt verder niet gebruikt. Maar goed, zelfs al zou deze wel gebruikt worden, is het handig om een naam te kiezen die meer verschilt van andere variabelen dan een enkele hoofdletter/kleine letter. Dat maakt de boel een stuk leesbaarder en kan fouten voorkomen.

Daarnaast zou ik de gewoonte aanleren om de UI controls een zelfgekozen naam te geven in plaats van de standaard-namen zoals "textBox3". Anders zit je over een jaar oude code te bekijken waar iets wordt gedaan met de inhoud van textBox12 in het onClick event van button7 en heb je geen idee waar het over gaat zonder telkens naar de UI te kijken en de control op te zoeken.

Bedenk voor jezelf een handige naming scheme. Als je in een groep / bedrijf werkt, spreek dan gezamelijk iets af. Zo gebruik ik zelf namen als "tbUserName" of "btnSubmit", waarbij de eerste 2-3 smallcase letters het type control aanduiden en daarna een beschrijving van de inhoud/functie.

Als extra leesvoer kun je wat gaan Googlen over best practices voor de naamgeving van variabelen, functies, enz...

|| Vierkant voor Wiskunde ||


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
Rannasha schreef op woensdag 17 september 2014 @ 10:13:
[...]


Een paar opmerkingen hierover, vooral over de naamgeving van variabelen. Je hebt nu een variabele "newName" en een variabele "NewName" (idem voor newTime). De eerste van de twee krijgt wel een waarde toegekend, maar wordt verder niet gebruikt. Maar goed, zelfs al zou deze wel gebruikt worden, is het handig om een naam te kiezen die meer verschilt van andere variabelen dan een enkele hoofdletter/kleine letter. Dat maakt de boel een stuk leesbaarder en kan fouten voorkomen.

Daarnaast zou ik de gewoonte aanleren om de UI controls een zelfgekozen naam te geven in plaats van de standaard-namen zoals "textBox3". Anders zit je over een jaar oude code te bekijken waar iets wordt gedaan met de inhoud van textBox12 in het onClick event van button7 en heb je geen idee waar het over gaat zonder telkens naar de UI te kijken en de control op te zoeken.

Bedenk voor jezelf een handige naming scheme. Als je in een groep / bedrijf werkt, spreek dan gezamelijk iets af. Zo gebruik ik zelf namen als "tbUserName" of "btnSubmit", waarbij de eerste 2-3 smallcase letters het type control aanduiden en daarna een beschrijving van de inhoud/functie.

Als extra leesvoer kun je wat gaan Googlen over best practices voor de naamgeving van variabelen, functies, enz...
Bedankt, dat ga ik vanaf nu in mijn projecten toepassen. En dat met die varables wist ik niet zo goed hoe ik ze anders moest noemen, maar is inderdaad nogal onoverzichtelijk, vooral als je een groot project hebt. Zal daar in de toekomst ook op letten :) Bedankt voor de feedback!
Ik ben nu aan het knutselen voor een Delete function, en als het dan helemaal werkt, een apart programmatje die aan de hand van de "time" een stopwatch achtig iets maakt die aftelt tot 0 en een melding geeft als dat klaar is :)

Als dát allemaal gedaan is ga ik het geheel in MVC toepassen, wat ik moet leren om mee te draaien met het bedrijf.

Edit:

Goedemorgen!

Er gaat iets fout als ik probeer data op te halen die past bij "SelectedIndex"SelectedValue. Want de selected index geeft alleen aan waar de item staat in de database combobox, en begint bij 0. De data in mijn database begint nu met ID 17, dus krijg ik daar een error omdat ik geen item heb met ID 0.

Nu kan ik wel alle data die bij dat ID hoort in een object variable zetten, maar hoe krijg ik "ID" uit mijn object variable zodat ik die ID kan vergelijken met een ID uit de database?

Alvast bedankt nogmaals :)

[ Voor 11% gewijzigd door Domih op 18-09-2014 09:45 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • sig69
  • Registratie: Mei 2002
  • Nu online
Domih schreef op woensdag 17 september 2014 @ 11:42:
[...]
Edit:

Goedemorgen!

Er gaat iets fout als ik probeer data op te halen die past bij "SelectedIndex". Want de selected index geeft alleen aan waar de item staat in de database
Nee, dat is denk een aanname van jou die niet klopt: MSDN: ComboBox.SelectedIndex Property (System.Windows.Forms)
, en begint bij 0. De data in mijn database begint nu met ID 17, dus krijg ik daar een error omdat ik geen item heb met ID 0.

Nu kan ik wel alle data die bij dat ID hoort in een object variable zetten, maar hoe krijg ik "ID" uit mijn object variable zodat ik die ID kan vergelijken met een ID uit de database?

Alvast bedankt nogmaals :)
Gebruik F1 of msdn. Lees wat properties doen, bekijk de andere properties van de class of er iets tussen zit wat je wellicht beter kunt gebruiken, en dan kom je waarschijnlijk hier uit: MSDN: ListControl.SelectedValue Property (System.Windows.Forms) (mits de ValueMember correct gezet is).

Edit: je gebruikt hierboven ook al SelectedValue, waarom gebruik je nu ineens SelectedIndex?

[ Voor 3% gewijzigd door sig69 op 18-09-2014 09:39 ]

Roomba E5 te koop


  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
sig69 schreef op donderdag 18 september 2014 @ 09:29:
[...]

Nee, dat is denk een aanname van jou die niet klopt: MSDN: ComboBox.SelectedIndex Property (System.Windows.Forms)

[...]

Gebruik F1 of msdn. Lees wat properties doen, bekijk de andere properties van de class of er iets tussen zit wat je wellicht beter kunt gebruiken, en dan kom je waarschijnlijk hier uit: MSDN: ListControl.SelectedValue Property (System.Windows.Forms) (mits de ValueMember correct gezet is).

Edit: je gebruikt hierboven ook al SelectedValue, waarom gebruik je nu ineens SelectedIndex?
Had 2 dingen inderdaad verkeerd gezegd, onhandig van me als ik hulp zoek.. Ik denk dat er een mooie collega voorbij liep ofzo :P

Ik krijg nu om een of andere reden wel de bijbehorende ID, wat goed is.
Het enige probleem wat ik nog heb is dat als ik het programma start, dat mijn "SelectedValue" = "Test.Farm_Herbs" (Naam van het project + naam van entities) Hierdoor krijg ik een foutmelding als ik het programma opstart, als ik echter vervolgens op continue druk, werkt het wel weer hoe het moet..

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • sig69
  • Registratie: Mei 2002
  • Nu online
Dan is op dat moment je ValueMember nog niet gezet, staat allemaal gewoon in de documentatie:
If a property is not specified in ValueMember, SelectedValue returns the results of the ToString method of the object.

Roomba E5 te koop


  • vandeGerrit
  • Registratie: Januari 2009
  • Laatst online: 26-08 12:51

vandeGerrit

Well, this can't be right

Domih schreef op woensdag 17 september 2014 @ 10:00:
code:
1
2
3
4
5
        private void button2_Click_1(object sender, EventArgs e)
        {
            List<Farm_Herbs> herb = db.Farm_Herbs.ToList();
         ........
        }
Wat is het idee er achter om .ToList te gebruiken. Wat er nu gebeurt, is dat jou code eerst de hele inhoud van de tabel naar binnen trekt, om er vervolgens slechts 1 item in te gaan zoeken. Stel dat deze tabel straks 100.000 rijen heeft, kan dit even duren.

Het entity framework werkt voornamelijk met de IQueryable interface. Zolang je de IQuerable interface doorgeeft, is het Entity Framework instaat om er uit eindelijk een passende query van te maken die alleen jou rij ophaalt die je nodig hebt.
Aangezien een List geen IQuerable inplementeerd, wordt de query direct afgevuurd en wordt alles opgehaald.

  • Domih
  • Registratie: Februari 2011
  • Laatst online: 23-09 14:40
sig69 schreef op donderdag 18 september 2014 @ 10:01:
Dan is op dat moment je ValueMember nog niet gezet, staat allemaal gewoon in de documentatie:

[...]
code:
1
2
3
4
            InitializeComponent();
            comboBox1.DataSource = db.Farm_Herbs.ToList();
            comboBox1.ValueMember = "ID";
            comboBox1.DisplayMember = "HerbName";

code:
1
2
3
4
            InitializeComponent();
            comboBox1.ValueMember = "ID";
            comboBox1.DisplayMember = "HerbName";
            comboBox1.DataSource = db.Farm_Herbs.ToList();


Ik had het eerst zoals in de eerste, dat werkte niet. Het 2e wel gelukkig. Bedankt!
vandeGerrit schreef op donderdag 18 september 2014 @ 10:06:
[...]


Wat is het idee er achter om .ToList te gebruiken. Wat er nu gebeurt, is dat jou code eerst de hele inhoud van de tabel naar binnen trekt, om er vervolgens slechts 1 item in te gaan zoeken. Stel dat deze tabel straks 100.000 rijen heeft, kan dit even duren.

Het entity framework werkt voornamelijk met de IQueryable interface. Zolang je de IQuerable interface doorgeeft, is het Entity Framework instaat om er uit eindelijk een passende query van te maken die alleen jou rij ophaalt die je nodig hebt.
Aangezien een List geen IQuerable inplementeerd, wordt de query direct afgevuurd en wordt alles opgehaald.
Ik ga hier nu even naar kijken, bedankt :)

[ Voor 43% gewijzigd door Domih op 18-09-2014 10:09 ]

Apple Carplay/Android Auto voor BMW/MINI/Audi/Mercedes: Nextgearmedia.nl


  • sig69
  • Registratie: Mei 2002
  • Nu online
Ik zat nog eens te denken: krijg je geen begeleiding vanuit je stageplaats? Dat zijn juist de mensen die je hiermee op gang zouden moeten helpen, leesvoer aanbieden, een vraagbaak zijn, leren debuggen, etc. Het komt op mij een beetje over alsof je VS hebt gestart en maar wat probeert. Ook doordat je met een winforms app begint icm entity framework (EF is niet echt beginnersmateriaal).

[ Voor 7% gewijzigd door sig69 op 19-09-2014 00:04 ]

Roomba E5 te koop


  • Lethalis
  • Registratie: April 2002
  • Niet online
Hier even een algemene tip: BindingSource.

Onderstaande code laat mijn rugharen recht overeind staan:

code:
1
2
3
4
var NewName = (from x in herb
                            where x.HerbName == label3.Text
                            select x).First();
            NewName.HerbName = textBox3.Text ;


Ik zou een "herb" uit de database uitlezen en dan aan een BindingSource koppelen. Alle controls worden via DataBindings gekoppeld aan deze BindingSource.

Op het eind kun je in 1 keer alle wijzigingen aan de "herb" opslaan.

Ask yourself if you are happy and then you cease to be.

Pagina: 1