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;
}
Warum möchten Sie 'DataGridView' an eine' DataTable' binden, die Sie mit einer 'List' erstellt haben? –
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. –
Ich verwende eine DataTable, weil ich den DataTable RowFilter verwenden möchte, um grundlegende Filterung von einem Textfeld aus durchzuführen. –