Associazioni per DataGridView ospitate in un'applicazione MFC

 C Programming >> Programmazione C >  >> Tags >> MFC
Associazioni per DataGridView ospitate in un'applicazione MFC

Un DataGridView di WinForms controllo ha la capacità di generare automaticamente le sue colonne e popolare da un'origine dati specificata (che può essere un DataSet , un semplice elenco o qualcos'altro). Tutto quello che devi fare è qualcosa del genere:

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

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

Quando fai lo stesso in MFC, non funziona (supponendo che tu abbia seguito tutti i passaggi per ospitare un controllo WinForms in un'applicazione MFC come descritto in MSDN).

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;

Dopo aver eseguito il debug tramite i sorgenti del framework .NET, mi sono reso conto che il problema era che la proprietà BindingContext di DataGridView il controllo era nullo . Questa proprietà rappresenta un gestore dell'elenco di associazioni per il controllo. Se questo è null quindi il controllo utilizzerà il contesto di associazione del genitore, che di solito è un modulo WinForms. Tuttavia, in questa applicazione MFC non esiste un modulo WinForms e il genitore di DataGridView il controllo è nullo , il che significa che il controllo non dispone di un gestore di associazioni e non è possibile impostare associazioni.

La soluzione è impostare in modo esplicito il BindingsContext proprietà a un contesto di associazione esistente (un nuovo oggetto) prima di impostare l'origine dati.

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

La lezione appresa è che quando si ospita un controllo WinForms in un'applicazione MFC, alcune cose non funzioneranno immediatamente, se si basano su una funzionalità di modulo padre. Non esiste un modulo WinForms di questo tipo e potrebbe essere necessario eseguire un'inizializzazione manuale aggiuntiva.