Wie kommst du auf die richtige Zuordnung name eine verbindliche Quelle gebunden an eine Liste<T>oder ein anonymer Typ, zur Verwendung auf einem DataGridTableStyle?

StackOverflow https://stackoverflow.com/questions/420386

Frage

Ich bin versuchen, um eine DataGridTableStyle-Objekt, so dass kann ich die Spaltenbreiten der ein DataGrid.Ich habe eine BindingSource-Objekt gebunden an eine Liste.Eigentlich ist es gebunden an einen anonymen Typ Liste erstellt, obwohl Linq in der folgenden Art und Weise (Variablennamen geändert für Klarheit, was ich Tue):

List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query;
myDataGrid.DataSource = myBindingSource;

Dann Erzeuge ich ein DataGridTableStyle-Objekt, und fügen Sie es an das datagrid.Jedoch, es ist nie gilt meinem Tisch Stil Eigenschaften habe ich eingerichtet, weil ich kann nicht scheinen, die richtige myDataGridTableStyle.MappingName-Eigenschaft.

Ich habe bei Google eine Suche für etwa 1/2 Stunde und sehe immer wieder links zu der gleichen Frage in einem ganzen Bündel von verschiedenen Foren (wörtlich den gleichen text, wie jemand, der gerade kopiert und eingefügt die Frage...Ich hasse es, dass...).Jedenfalls keiner der Vorschläge funktioniert, wie der Typ sagt auf allen anderen Webseiten.

Also, hat jemand hier wissen, was ich brauche, um die MappingName-Eigenschaft zu haben, um meine TableStyle eigentlich ordnungsgemäß funktionieren?Wo kann ich schnappe mir die Namen aus?(Es kann nicht leer sein...das funktioniert nur mit einer BindingSource gebunden ist, um ein DataTable-oder SqlCeResultSet etc.).

Ich denke, es könnte ein Problem mit mir mit Linq erstellen einer anonymen, mehr spezialisierte version der Objekte mit nur die Felder, die ich brauche.Sollte ich einfach versuchen zu binden die BindingSource direkt in die Liste ein Objekt?Oder vielleicht sogar binden des DataGrid-direkt in der Liste Objekt und überspringen Sie die verbindliche Quelle zusammen.

Vielen Dank

PS - C#, Compact Framework-v3.5

UPDATE:

Ich habe eine Antwort unten, die mein problem gelöst.Ob oder nicht, es ist der beste Ansatz, es hat funktioniert.Einen Blick Wert, wenn Sie das gleiche Problem hatte ich auch.

War es hilfreich?

Lösung

Ich habe den Weg gefunden, diese Arbeit zu machen. Ich werde es brechen in Abschnitte ...


List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

DataGridTableStyle myDataGridTableStyle = new DatGridtTableStyle();
DataGridTextBoxColumn colA = new DataGridTextBoxColumn();
DataGridTextBoxColumn colB = new DataGridTextBoxColumn();
DataGridTextBoxColumn colC = new DataGridTextBoxColumn();

colA.MappingName = "FieldA";
colA.HeaderText = "Field A";
colA.Width = 50; // or whatever;

colB.MappingName = "FieldB";
.
... etc. (lather, rinse, repeat for each column I want)
.

myDataGridTableStyle.GridColumnStyles.Add(colA);
myDataGridTableStyle.GridColumnStyles.Add(colB);
myDataGridTableStyle.GridColumnStyles.Add(colC);

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query.ToList(); // Thanks Marc Gravell

// wasn't sure what else to pass in here, but null worked.
myDataGridTableStyle.MappingName = myBindingSource.GetListName(null); 

myDataGrid.TableStyles.Clear(); // Recommended on MSDN in the code examples.
myDataGrid.TablesStyles.Add(myDataGridTableStyle);
myDataGrid.DataSource = myBindingSource;

Also im Grunde muss die DataGridTableStyle.MappingName wissen, welche Art von Objekt ist es Mapping. Da mein Objekt einen anonymen Typ ist (mit Linq erstellt), weiß ich nicht, was es erst zur Laufzeit ist. Nachdem ich die Liste des anonymen Typs an die Bindungsquelle, binden kann ich BindingSource.GetListName (null) verwenden, um die String-Darstellung des anonymen Typs zu erhalten.

Eine Sache zu beachten. Wenn ich nur den myList gebunden direkt an die Bindungsquelle (die „myType“ ist der Typ), konnte ich nur die Zeichenfolge „myType“ verwendet habe, als der Wert für DataGridTableStyle.MappingName.

Hoffentlich ist nützlich, um andere Menschen!

Andere Tipps

Sie einfach auf die Sammlung von Antworten hinzuzufügen, bereits auf dieser Seite ....

ich mit dem gleichen Problem nur frustriert war versucht, meine Faust-Anwendung mit Windows Forms und Compact Framework (für Windows Mobile 6.5).

zu entwickeln

Was habe ich herausgefunden, durch Marc GRA Kommentar oben ist, dass in der Tat möglich ist, die Laufzeit Mapping Inspektion der Eigenschaften des Datagrid zu erhalten. Dadurch fand ich heraus, dass, wenn mein List<MyType> direkt an der Datasource Eigenschaft des Datagrid zu binden, wurde das Datagrid eigentlich auf der Suche nach einem Datagrid mit dem Mapping von

"List`1"

anstelle einer beliebigen Kombination von List<MyType> oder MyType ...

So ... von „List`1“ im Mapping-Namen auf der Datagrid Sammlung Editor (zur Design-Zeit) setzt, konnte ich die Spalten und andere Eigenschaften anpassen, ohne sie alle zur Laufzeit erstellen zu müssen.

Ich hoffe nur, das etwas mehr auf die Antworten fügt bereits zur Verfügung gestellt. Vielen Dank an alle für mich mit den Leitlinien vorgesehen werden.

Die Abfrage IEnumerable<T> für einige T, aber die meisten verbindliches Quellen (außer ASP.NET) erforderlich IList (wie IList<T> Umsetzung) - versuchen Sie, .ToList() - D. H.

myBindingSource.DataSource = query.ToList();

Ein BindingList<T> funktioniert vielleicht sogar besser (wenn es unterstützt CF 3.5), da es eine bessere Unterstützung für einige der häufigsten verbindliche Szenarien;wenn Sie diese (und vorausgesetzt, BindingList<T> existiert auf CF 3.5), können Sie eine Erweiterungsmethode:

static BindingList<T> ToBindingList<T>(this IEnumerable<T> data)
{
    return new BindingList<T>(new List<T>(data));
}

dann rufen:

myBindingSource.DataSource = query.ToBindingList();

Für die Vollständigkeit, die eine alternative zu IList ist IListSource (oder auch Type für rein-Metadaten Szenarien), die ist warum DataSource wird Häufig als eingegeben haben object;wenn es nicht für dieses Problem, der compiler würde wahrscheinlich in der Lage gewesen, Ihnen zu sagen, das problem (d.h.wenn DataSource wurde definiert als IList).

Ich folgte diese Antwort und stellte fest, dass der Mapping kam heraus, um immer den zugrunde liegenden Klassenname zu sein (myType im Beispiel).

So scheint es, dass die Sammlung setzt es durch das Binding löst das Problem sowieso, und dass es dann keine Notwendigkeit für BindingSource.GetListName (null).

Auch fand ich keine Notwendigkeit, ToList (), um die Abfrage als Binding wird auch dies für Sie tun.

Vielen Dank an Jason unten für mich auf dem richtigen Weg setzen.

Ich war mit Blick auf gleiches Problem für Spaltenbreite einstellen. Nach viel Forschung und Entwicklung, änderte ich Code wie unten und seine adaequat. Code:

DataGridTableStyle tableStyle = new DataGridTableStyle();
tableStyle.MappingName = dgCustom.DataSource.GetType().Name;

Dabei gilt dgCustom Datagrid-ID in dgCustom.DataSource.GetType().Name ist, die perfekt funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top