LINQ a data grid .

Odpowiedz Nowy wątek
2009-03-13 00:09
0

Sprawa wygląda następująco :
Jak wiadomo z kazdego tutoriala:

  var cars = from p in db.tb_Cars 
                       select p
                       ;

dataGridView1.DataSource = cars;

Pobierze mi wszystkie dane z tabeli tb_Cars i wyswietli w datagridzie.
Oraz przy użyciu :

private void button1_Click(object sender, EventArgs e)
        {
                db.SubmitChanges();
                label1.Text = "Dokonano zmian.";
        }

Dodawać/zmieniać poszczególne rekordy.

Problem pojawia sie gdy chce pobierac tylko niektóre kolumny
Jedyny znany mi sposób na pobranie poszczególnych kolumn to:

var cars = from p in db.tb_Cars 
                       select new {     
                           marka = p.mark, 
                           model = p.model                       
                       }
                       ;

Ale tu zaczynają się schody , bo przy takim formacie danych jaki zwraca LINQ przy tym zapytaniu, nie można dodawać/edytowac rekordów.

Czy jest jakiś sposób aby to ominąć? Mam na myśli inne zapytanie. Bo zdaje sobię sprawę , że jest masa innych sposobów na dodanie/edycje rekordów, ale dużo bardziej pracochłonnych. A LINQ dopiero się uczę i chętnie bym się dowiedział czy ma taką możliwość.

Dziękuje za pomoc z góry.
Oraz pozdrawiam.

Pozostało 580 znaków

2009-03-13 15:57
0

var cars = from p in db.tb_Cars
select p
;

dataGridView1.DataSource = cars;
Można prościej:

dataGridView1.DataSource = db.tb_Cars;

Problem pojawia sie gdy chce pobierac tylko niektóre kolumny
Dodaj interesujące cię kolumny do DataGridView.Collumns.
Można ustawić podpis kolumny, sposób formatowania, własne wyrażenie na obliczanie wartości...

Pozostało 580 znaków

2009-03-13 16:03
0

No tak ale w momencie gdy chce pobrać dane nie tylko z jednej tabeli a np:

       var cars = from p in db.tb_Cars
                       from d in db.tb_EngineContents
                       select new { p.mark, p.model, d.Range }
                       ;

Nie moge juz uzyc

 from p in db.tb_cars
from d in db.tb_EngineContents
select p,d

i wtedy w data gridzie ustalic ktore kolumny chce.

Stąd cały problem. Bo ograniczenie wyświetlania kolumn pobranych przy pomocy linq z 1 tabeli , faktycznio możnaby tak łatwo rozwiązać.

Pozostało 580 znaków

2009-03-13 16:16
0

Skoro chcesz wybierać kolumny, to trzeba je jakoś identyfikować, więc nienazwana struktura odpada. Zdefiniuj konkretną klasę:

class CarWithRange
{
   string mark;
   //...
   public CarWithRange(string mark, string model, string range) { this.mark = mark; ... }
}
//...
var cars = 
   from p in db.tb_Cars
   from d in db.tb_EngineContents
   select new CarWithRange(p.mark, p.model, d.Range);

Pozostało 580 znaków

2009-03-13 17:48
sarinorro
0

jako ze programowanie obiektowe utyka u mnie jeszcze mocno bardzo, sam bym nie wpadl na to:> dzieki wielkie

Pozostało 580 znaków

2009-03-13 20:05
sarinorro
0

Hmm problem jednak nie do konca został rozwiązany.
To zapytanie wciaz zwraca typ System.Linq.IQueryable<t>
I nie bardzo moge odwolac się do własciwosci tej klasy która utworzyłem.

Właściwie to juz tamten problem jakos ominąłem, ale teraz potrzebuje uzupełnic ListBox wynikiem zapytania Linqowego, a nie bardzo sie daje póki zwraca mi taki typ.
Oczywiscie moglbym pobrac tylko jedno pole zeby itemy ustawic. Ale chce ustawic tez Value , a do tego juz mi potrzebne drugie pole.
W sumie można to zrobic robiąc dwa zapytania oddzielne, ale czy nie ma bardziej eleganckiej drogi?

Pozostało 580 znaków

2009-03-13 21:23
0
adf88 napisał(a)

Skoro chcesz wybierać kolumny, to trzeba je jakoś identyfikować, więc nienazwana struktura odpada. Zdefiniuj konkretną klasę:

IMHO, nie prawda. Nienazwana struktura ma rowniez pola, w dodatku o nazwach scisle okreslonych (ba - mozesz te nazwy nawet sam okreslic..) i doskonale nadaje sie do databindingu w gridach. majac np:

grid.datasource = from x in y select new{ x.nazwa, x.opis, koszt = x.cena*x.ilosc };

wygenerowana anonimowa klasa otrzyma properties: "nazwa", "opis", "koszt", i takowe sa uzyteczne jako wpis do DataField grida czy gridview

inna rzecz - tak jak autor zauwazyl, wyniku takiego 'zapytania' nie mozna wprost edytowac i wyslac na baze. tak jak przy select'cie sobie dane mozna 'zapakowac' do anonima, tak i potem, gdy user kaze zapisac dane, trzeba je najpierw wypakowac, na ich podstawie wprowadzic zmiany we wlasciwych obiektach linq2sql i dopiero wtedy savechanges na datacontext zrobi cokolwiek sensownego..

..albo wrocic do starego dataset/datatable/dataview..


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał

Pozostało 580 znaków

2009-03-14 12:55
0

majac np:

grid.datasource = from x in y select new{ x.nazwa, x.opis, koszt = x.cena*x.ilosc };

wygenerowana anonimowa klasa otrzyma properties: "nazwa", "opis", "koszt",
hmm, tego nie znałem :)</quote>

Pozostało 580 znaków

2009-12-17 16:18
rory
0

Hej to jak w końcu rozwiązać problem podany w 1 poście przez Autora? Chętnie bym się dowiedział bo również chcę móc jak najefektywniej edytować dane pobierane z kilku tabel.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0