2010-04-15 15 views
9

// Z mojego formularzaFill WinForm DataGridView od anonimowo Linq Query

BindingSource bs = new BindingSource(); 

private void fillStudentGrid() 
{ 
    bs.DataSource = Admin.GetStudents(); 
    dgViewStudents.DataSource = bs; 
} 

// z klasy Admin

public static List<Student> GetStudents() 

{ 
    DojoDBDataContext conn = new DojoDBDataContext(); 

    var query = 
     (from s in conn.Students 
     select new Student 
     { 
      ID = s.ID, 
      FirstName = s.FirstName, 
      LastName = s.LastName, 
      Belt = s.Belt 
     }).ToList(); 

    return query; 
} 

próbuję wypełnić kontrolę DataGridView w WinForm, a ja tylko chcesz mieć kilka wartości. Kod kompiluje, ale zgłasza błąd runtime:

Jawna konstrukcja typu "DojoManagement.Student" w zapytaniu jest niedozwolona.

Czy istnieje sposób, aby to działało w ten sposób?

Odpowiedz

5

masz już instancję IEnumerable<Student> i nie może wystawać podmioty z zapytania z powodów opisanych here)

też don” • Aby utworzyć listę powiązaną z tym źródłem danych, możesz znacznie uprościć swoją metodę, zmieniając ją na:

public static IEnumerable<Student> GetStudents() 
{ 
    return new DojoDBDataContext().Students; 
} 

Nie ma powodu, aby projektować nową instancję, aby odwzorować tylko kilka właściwości, wykonując zapytanie, w którym zwracasz wszystkie wartości, a twoja projekcja niczego nie oszczędza. Jeśli naprawdę chcesz, aby zwrócić tylko kilka wartości z tego zapytania dla celów informacji ukrywanie można to zrobić:

public static IEnumerable<Object> GetStudents() 
{ 
    DojoDBDataContext conn = new DojoDBDataContext(); 

    return conn.Students 
       .Select(s => new { 
        ID = s.ID, 
        FirstName = s.FirstName, 
        LastName = s.LastName, 
        Belt = s.Belt 
       }); 
} 

Edit: Jeśli nie używasz C# 4 będzie trzeba rzucić zawartość z IEnumerable<T> do Object jawnie. Tylko C# 4 obsługuje kowariancję dla IEnumerable<T>. Więc jeśli używasz C# 3, będziesz musiał to zrobić:

public static IEnumerable<Object> GetStudents() 
{ 
    DojoDBDataContext conn = new DojoDBDataContext(); 

    return conn.Students 
       .Select(s => new { 
        ID = s.ID, 
        FirstName = s.FirstName, 
        LastName = s.LastName, 
        Belt = s.Belt 
       }).Cast<Object>(); 
} 
+0

Projektuję nową instancję Studenta, ponieważ ... no cóż, tak naprawdę nie wiem, co robię (oczywiście). Mogę łatwo uzyskać wszystkie informacje od wszystkich studentów, ale POTRZEBUJĘ tylko kilku pól i wypełniam widok datagrid w środowisku wykonawczym, ponieważ jest on tylko do odczytu. – mdvaldosta

+0

Dzięki za kod i lekcję. – mdvaldosta

1

Wystarczy zwraca listę obiektów typu anonimowego:

public static List<object> GetStudents() 
{ 
    DojoDBDataContext conn = new DojoDBDataContext(); 

    var query = 
     (from s in conn.Students 
     select new 
     { 
      ID = s.ID, 
      FirstName = s.FirstName, 
      LastName = s.LastName, 
      Belt = s.Belt 
     }).Cast<object>().ToList(); 

    return query; 
} 
+0

Świetnie, że działa! Nie mogę pomóc, ale myślę, że jest lepszy sposób niż rzucanie. – mdvaldosta

+0

Cóż, nie można zwrócić listy typu anonimowego, a "Lista " nie może być przypisana do listy obiektów ... więc trzeba rzutować. W każdym razie prawdopodobnie lepiej byłoby zwrócić prawdziwe obiekty Studenta z GetStudents i wykonać projekcję dopiero przed przypisaniem źródła danych –

3

Kiedyś szukałem rozwiązania, aby wyświetlić wyniki na widoku Grid. Problem polegał na tym, że zapomniałem ustawić właściwość datagrid: "Źródło danych" na Brak na Winform.

Jest to proste rozwiązanie dla wyświetlacza gridview z LINQ (tylko przykładowy kod)

DataGrid dataGrid1 = new DataGrid(); 

var custQuery = 
    from cust in db.Customers 
    select cust; 

dataGrid1.DataSource = custQuery; 
+0

Szukałem wszystkich zaawansowanych rozwiązań związanych z wiązaniem i przeoczyłem najprostsze. Ten rozwiązał dla mnie. Dzięki – djv

Powiązane problemy