2016-08-05 14 views
1

Ich habe eine vorhandene Datenrasteransicht, deren DataSource eine Datentabelle ist, die ich aus einer Liste eines benutzerdefinierten Objekts auffüllen.Hinzufügen von ComboBox-Spalte zu vorhandenem DataTable DataGridView

private myDataTable = new DataTable(); 

List<SomeObjectModel> dataSource = (from e in queryResults 
    select 
     new SomeObjectModel 
     { 
      Id = e.Id, 
      Priority = e.Name, 
      Channel = e.Channel 
     }).ToList(); 

myDataTable = ToDataTable(dataSource); //See method below 
dataGridView.DataSource = myDataTable; 

Von einer vorherigen Frage auf Stackoverflow, fand ich die ToDataTable Methode, die ich dort bin mit, die zum Drehen meiner Liste von Objekten in eine Datatable mit Reflexion arbeitet:

public static DataTable ToDataTable<T>(List<T> items) 
    { 
     DataTable dataTable = new DataTable(typeof(T).Name); 
     PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     foreach (PropertyInfo prop in Props) 
     { 
       dataTable.Columns.Add(prop.Name); 
     } 

     foreach (T item in items) 
     { 
      var values = new object[Props.Length]; 
      for (int i = 0; i < Props.Length; i++) 
      { 
       values[i] = Props[i].GetValue(item, null); 
      } 
      dataTable.Rows.Add(values); 
     } 

     dataTable.AcceptChanges(); 

     return dataTable; 
    } 

Dies ist für alle Montagearbeiten Meine DataGridViewTextBox-Spalten. Nun möchte ich eine neue DataGridViewComboBoxColumn mit dem Namen "Person" zum Datenraster hinzufügen, die eine ValueMember = "PersonId" und eine DisplayMember = "PersonName" aus einer Liste eines Person-Objekts enthält.

Ich bleibe hier stecken verstehen, wie diese Art von Spalte zu meinem Datengitter von einer Datentabelle hinzufügen.

Mein Person-Objekt hat einfach wieder die Eigenschaften PersonId und PersonName, die ich als ValueMember und DisplayMember des Kombinationsfelds verwenden möchte.

Ich bin fest, aber mein Denken ist: 1.) Update-SomeObjectModel Person enthalten, 2.) aktualisieren ToDataTable Methode eine enthalten, wenn Klausel zu fangen, wenn der Elementname „Person“ ist, aber ich Ich bin mir nicht sicher, was ich für die Zeilen tun soll. Außerdem fühlt es sich hacky an, einfach nach dem Namen der Eigenschaft zu suchen, da ich ToDataTable sauber halten möchte.

public static DataTable ToDataTable<T>(List<T> items) 
    { 
     DataTable dataTable = new DataTable(typeof(T).Name); 
     PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     foreach (PropertyInfo prop in Props) 
     { 
      if (prop.Name = "Person") { // Create DataGridViewComboBoxColumn } 

      else 
      { 
       dataTable.Columns.Add(prop.Name); 
      } 

     } 

     foreach (T item in items) 
     { 
      var values = new object[Props.Length]; 
      for (int i = 0; i < Props.Length; i++) 
      { 
       values[i] = Props[i].GetValue(item, null); 
      } 

      dataTable.Rows.Add(values); 
     } 

     dataTable.AcceptChanges(); 

     return dataTable; 
    } 
+0

Warum möchten Sie 'DataGridView' an eine' DataTable' binden, die Sie mit einer 'List ' erstellt haben? –

+0

Auch die 'ToDataTable' Methode benötigt eine Korrektur beim Hinzufügen von Spalten. Sie sollten Spalten folgendermaßen hinzufügen:' dataTable.Columns.Add (prop.Name, prop.PropertyType); '. Wenn Sie den Typ der Spalte nicht angeben, wird der String-Typ verwendet. –

+0

Ich verwende eine DataTable, weil ich den DataTable RowFilter verwenden möchte, um grundlegende Filterung von einem Textfeld aus durchzuführen. –

Antwort

0

Hier ist ein Beispiel dessen, was ich in der Vergangenheit für diese ... einfaches Formular mit einem Drop-Down mit dem „Personen“ -Liste geladen getan haben. Button, der nach allen Kriterien filtert ... hoffe, es hilft.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     private class Person 
     { 
      public int PersonId { get; set; } 
      public string Name { get; set; } 
     } 

     private class Course 
     { 
      public int CourseId { get; set; } 
      public string CourseName { get; set; } 
      public int ProfessorId { get; set; } 
     } 

     private List<Course> courses = new List<Course>(); 
     private List<Person> professors = new List<Person>(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      courses.Add(new Course { CourseId = 1, CourseName = "Math", ProfessorId = 1 }); 
      courses.Add(new Course { CourseId = 2, CourseName = "English", ProfessorId = 2 }); 
      courses.Add(new Course { CourseId = 3, CourseName = "History", ProfessorId = 1 }); 

      professors.Add(new Person { PersonId = 1, Name = "John Doe" }); 
      professors.Add(new Person { PersonId = 2, Name = "Jane Doe" }); 

      cboProfessors.DisplayMember = "Name"; 
      cboProfessors.ValueMember = "PersonId"; 
      cboProfessors.DataSource = professors; 

      grdCourses.AutoGenerateColumns = false; 
      grdCourses.Columns.Add(new DataGridViewTextBoxColumn { Name = "CourseId", HeaderText = "Course ID #", DataPropertyName="CourseId" }); 
      grdCourses.Columns.Add(new DataGridViewTextBoxColumn { Name = "Name", HeaderText = "Course Name", DataPropertyName="CourseName" }); 
      grdCourses.Columns.Add(new DataGridViewComboBoxColumn { Name = "Professor", HeaderText = "Professor", DataSource = professors, 
       DisplayMember = "Name", ValueMember = "PersonId", DataPropertyName="ProfessorId" }); 

      grdCourses.DataSource = courses; 
     } 

     private void btnFilter_Click(object sender, EventArgs e) 
     { 
      int professorId = (int)cboProfessors.SelectedValue; 
      List<Course> filteredCourses = courses.Where(x => x.ProfessorId == professorId).ToList(); 
      grdCourses.DataSource = filteredCourses; 
     } 
    } 
} 
Verwandte Themen