Bindungen für DataGridView, die in einer MFC-Anwendung gehostet werden

 C Programming >> C-Programmierung >  >> Tags >> MFC
Bindungen für DataGridView, die in einer MFC-Anwendung gehostet werden

Ein WinForms DataGridView -Steuerelement hat die Fähigkeit, seine Spalten automatisch zu generieren und aus einer angegebenen Datenquelle (die ein DataSet sein kann) zu füllen , eine einfache Liste oder etwas anderes). Alles, was Sie tun müssen, ist etwa Folgendes:

var list = new List<Record>() {new Record() {Id = 1, Name = "item 1", Date = DateTime.Now}};

this.dataGridView.AutoGenerateColumns = true;
this.dataGridView.DataSource = list;

Wenn Sie dasselbe in MFC tun, funktioniert es nicht (vorausgesetzt, Sie haben alle Schritte zum Hosten eines WinForms-Steuerelements in einer MFC-Anwendung ausgeführt, wie in MSDN beschrieben).

m_dgv->AutoGenerateColumns = true;
auto source = gcnew System::Collections::Generic::List<Record^>();
auto r1 = gcnew Record();
r1->Id = 1;
r1->Name = "item 1";
r1->Date = System::DateTime::Now;
source->Add(r1);

m_dgv->DataSource = source;

Nach dem Debuggen durch die .NET-Framework-Quellen erkannte ich, dass das Problem darin bestand, dass die BindingContext-Eigenschaft der DataGridView control war null . Diese Eigenschaft stellt einen Manager der Liste der Bindungen für das Steuerelement dar. Wenn dies null ist dann verwendet das Steuerelement den Bindungskontext des übergeordneten Elements, bei dem es sich normalerweise um ein WinForms-Formular handelt. In dieser MFC-Anwendung gibt es jedoch kein WinForms-Formular und das übergeordnete Element von DataGridView control ist null , was bedeutet, dass das Steuerelement keinen Bindungsmanager hat und keine Bindungen festgelegt werden können.

Die Lösung besteht darin, den BindingsContext explizit zu setzen -Eigenschaft in einen vorhandenen Bindungskontext (ein neues Objekt) einfügen, bevor Sie die Datenquelle festlegen.

m_dgv->BindingContext = gcnew System::Windows::Forms::BindingContext();
m_dgv->DataSource = source;

Die gelernte Lektion ist, dass beim Hosten eines WinForms-Steuerelements in einer MFC-Anwendung einige Dinge nicht sofort einsatzbereit sind, wenn sie sich auf eine übergeordnete Formularfunktionalität verlassen. Es gibt kein solches WinForms-Formular und Sie müssen möglicherweise eine zusätzliche manuelle Initialisierung durchführen.