Gå til innhold

Anbefalte innlegg

Heisan

Sett at man har følgende tabell struktur:

 

Poststeder -->> Kontakter

 

Så har man følgende LINQ uttrykk:

var kontakter = from k in db.Kontakter
			select k;

 

Dermed har jeg en iQueryable<Kontakter> som inneholder alle kontaktene med tilhørende poststed

 

Jeg ønsker dermed å vise navn og poststed i en datagridview, men i selve datagrid viewet så kommer kontaktens relaterte post opp som et slags uttrykk for relasjonen og ikke selve verdien. Hvordan kan jeg endre dette by code?

 

Jeg setter jo opp datagrid viewet slik:

dgvKunder.DataSource = kontakter;
foreach (DataGridViewColumn c in dgvKunder.Columns)
{
 c.Visible = false;
}
dgvKunder.Columns["Kontaktnavn"].Visible = true;
dgvKunder.Columns["Kontaktnavn"].ColumnText = "Kundenavn";

dgvKunder["Hva skal det stå her for postdstedet"].Visible = True;
....

All hjelp mottas selvsagt med takk....

Lenke til kommentar
Videoannonse
Annonse

Hvis jeg ikke bommer helt her, så har du jo mistet hele relasjonen til poststed i det du henter ut bare kontaktene og vil vel derfor få et issue med å vise dem. Den første LINQ queryen må bli en join mellom begge tabellene skulle jeg tro...hvis jeg har forstått ting riktig.

Lenke til kommentar

nei. En LINQ query tar med seg alt som er definert i databasen. Det vil si at følgende er mulig:

var kunde = (from k in db.Kontakter 
		 where k.KundeID = 1234
		 select k).FirstOrDefault();
MessageBox.Show(k.Fulltnavn + " bor i " + k.Poststeder.Poststed + " med postnummer = " + k.Poststeder.Postnr);

Dette for kunn en record. Skal man ha et helt datasett kan man gjøre slik:

var kunder = from k in db.Kontakter
		 select k;
foreach(Kontakt k in kunder)
 MessageBox.Show(k.Fulltnavn + " bor i " + k.Poststeder.Poststed + " med postnummer = " + k.Poststeder.Postnr);

som gir en liste

Ganske fancy serru. Poenget er at LINQ jobber veldig tett imot SQL serveren og oppbyggingen av SQL databasen er veldig sentralt. Jeg synes iallefall dette er kjempekult og sparer meg for masse koding

Lenke til kommentar

humm....så "Poststeder -->> Kontakter" er ikke en en-til-mange relasjon? Hvis Kontakt objektet ditt består av mange Poststeder, så er det litt misvisende. Eller er Poststeder propertyen på Kontakt objektet egentlig Postaddresse? scratch det der...tenkte (ikke) litt fort her xD

 

Jeg er forsåvidt klar over hvordan LINQ fungerer, men det var litt uklart hvordan ting er sydd sammen i koden din etter bare å ha lest første post :)

 

Tror jeg har det klart hvordan ting er hos deg nå...må bare tenke litt videre hvordan det skal løses ^^

Endret av The Jackal
Lenke til kommentar

private void Form1_Load(object sender, EventArgs e)
	{
		List<Kontakt> kontakter = new List<Kontakt>();
		Kontakt kontakt = new Kontakt();
		kontakt.Fornavn = "Per";
		kontakt.Etternavn = "Hansen";
		PostAddresse addresse = new PostAddresse();
		addresse.PostNummer = 0192;
		addresse.PostSted = "Oslo";
		kontakt.PostAddresse = addresse;
		kontakter.Add(kontakt);

		kontakt = new Kontakt();
		kontakt.Fornavn = "Ole";
		kontakt.Etternavn = "Olsen";
		addresse = new PostAddresse();
		addresse.PostNummer = 0195;
		addresse.PostSted = "Oslo";
		kontakt.PostAddresse = addresse;
		kontakter.Add(kontakt);

		var query = from k in kontakter
					select new {k.FulltNavn, k.PostAddresse.PostNummer, k.PostAddresse.PostSted};

		dataGridView1.DataSource = query.ToList();
	}

 

Dette fungerer fint hos meg i alle fall...håper det kan være litt til hjelp :) Griden vil da automatisk bygge seg opp med kolonner og 2 rader.

Lenke til kommentar
private void Form1_Load(object sender, EventArgs e)
	{
		List<Kontakt> kontakter = new List<Kontakt>();
.........
		kontakter.Add(kontakt);

		var query = from k in kontakter
					select new {k.FulltNavn, k.PostAddresse.PostNummer, k.PostAddresse.PostSted};

		dataGridView1.DataSource = query.ToList();
	}

 

Dette fungerer fint hos meg i alle fall...håper det kan være litt til hjelp :) Griden vil da automatisk bygge seg opp med kolonner og 2 rader.

Ja. dette er en måte å gjøre det på, men det burde ikke være nødvendig å påvirke resultatsettet. Dessuten vil en slik måte å gjøre det på ta vekk en del grunnleggende funksjonalitet som følger med i Linq2SQL. Eksempelvis vil alle endringer man gjør i de relaterte postene bli lagret ved neste SubmitChangeds(). Gjør man det på denne måten som du viser til så må man også ta hensyn til alle disse tingene manuellt.

 

Kansje en løsning vil være å legge til en ny kolonne og heller styre innholdet av denne på en eller annen måte.

Lenke til kommentar

Problemet her *tror* jeg er at DataGridViewTextBoxColumn (som jeg tror er default kolonnetype) ikke har DisplayMember property, eller no lignende. Hvis du ikke gjør det på måten jeg gjorde, eventuelt overrider ToString() på Poststeder klassen din til å returnere den stringen du vil ha i kolonnen, så tror jeg du må lage din egen kolonnetype for å fikse det, eller lage en egen CellTemplate til kolonnen :) Dette er forøvrig ganske lett i WPF :p

Lenke til kommentar

Tja...det ligner jo ikke html i det hele tatt...men selve GUIen på appikasjonen skrives i XAML (xml lignende syntaks). Dvs...du kan fint utforme selve GUI ved hjelp av drag'n'drop som i vanlig forms, eller du kan velge å skrive markupen selv.

 

Nå finnes det faktisk ikke en datagrid i default WPF, men MS har releaset en WPFToolKit hvor du får det du trenger, og jeg tror planen er at dette etterhvert blir en del av default installasjonen (C# 4.0 sikkert). Den kan lastes ned her: http://www.codeplex.com/wpf

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...