2011-10-05 17 views
5

Sto provando a ottenere qualcosa impostato in un DataGridView. Sembra che questo dovrebbe essere abbastanza semplice, ma sto avendo problemi. Voglio visualizzare tre colonne:DataGridViewComboBoxColumn DataSource?

  • CodeID
  • CodeName
  • ComboBox con DisplayMember di TypeName, ValueMember di TypeID

voglio essere in grado di scegliere tra tutti i possibili valori di TypeName. Ecco il mio dilemma:

Se carico tutto questo in uno DataTable e impostare il DataGridView come DataSource, posso visualizzare il esistente TypeName per il record, ma la casella combinata Non includere altri valori. Se imposto lo DataSource per DataGridViewComboBoxColumn su un DataTable separato che include tutti i possibili TypeNames, il valore esistente non viene visualizzato.

DataGridView è davvero fastidioso lavorare con così sia una soluzione per questo o un'alternativa valida sarebbe apprezzato.

Modifica: sembra che il problema sia causato dal fatto che desidero avere un articolo separato per DisplayMember e ValueMember. I seguenti lavori, se non mi preoccupo sull'impostazione della ID come ValueMember:

var typeColumn = new DataGridViewComboBoxColumn 
{ 
    DataSource = typeList, 
    DisplayMember = "Type", 
    ValueMember = "Type", 
    DataPropertyName = "Type" 
} 

Se faccio la seguente, i tipi giusti sono selezionati, ma non posso cambiare la selezione nella casella combinata:

var typeColumn = new DataGridViewComboBoxColumn 
{ 
    DataSource = typeList, 
    DisplayMember = "Type", 
    ValueMember = "TypeID", 
    DataPropertyName = "TypeID" 
} 

Se uso il seguente ottengo un errore di FormatException come si sta cercando di popolare:

var typeColumn = new DataGridViewComboBoxColumn 
{ 
    DataSource = typeList, 
    DisplayMember = "Type", 
    ValueMember = "TypeID", 
    DataPropertyName = "Type" 
} 

edi t: typeList è una semplice DataTable popolato dal seguente:

SELECT DISTINCT IT.InsuranceTypeID, IT.[Type] 
FROM InsuranceType IT 
WHERE IT.ClientID = @ClientID 
ORDER BY [Type] 
+0

Si sta impostando il DataPropertyName sul DGVCBC? Inoltre, icona del profilo epico. http://social.msdn.microsoft.it/forums/en-US/winformsdatacontrols/thread/952b1cc9-4ba7-4b16-abdf-be2cdfde6460/ –

+0

Sì ... guarda la mia modifica. –

+0

Puoi pubblicare come hai impostato 'typeList' e la struttura che stai aggiungendo alla lista? I tipi di 'DataPropertyName' e' ValueMember' devono essere gli stessi, il che probabilmente è il motivo per cui si ottiene l'eccezione nell'ultimo esempio. – SwDevMan81

risposta

3

Ok, mi si avvicinò con un esempio ClientInfo e InsuranceDetails che credo possa imitare ciò che stai cercando di fare. Fammi sapere se questi dettagli non sono giusti. Questo esempio popolerà la DataGridViewComboBox e impostare il valore in base al InsuranceDetails (specificamente a: InsurDetailz = all_insurance_types[2])

public partial class Form1 : Form 
    { 
     private ClientInfo _myClient; 
     private BindingList<InsuranceDetails> all_insurance_types = 
     new BindingList<InsuranceDetails>(); 

     public Form1() 
     { 
     InitializeComponent(); 

     DataGridView grid = new DataGridView(); 
     grid.Dock = DockStyle.Fill; 
     grid.AutoGenerateColumns = true; 

     all_insurance_types.Add(new InsuranceDetails(1, "Health")); 
     all_insurance_types.Add(new InsuranceDetails(2, "Home")); 
     all_insurance_types.Add(new InsuranceDetails(3, "Life")); 

     var col = new DataGridViewComboBoxColumn 
     { 
      DataSource = all_insurance_types, 
      HeaderText = "Insurance Type", 
      DataPropertyName = "InsurDetailz", 
      DisplayMember = "ItType", 
      ValueMember = "Self", 
     }; 

     _myClient = new ClientInfo { 
      InsurDetailz = all_insurance_types[2], Name = "Jimbo" }; 
     grid.Columns.Add(col); 
     grid.DataSource = new BindingList<ClientInfo> { _myClient }; 
     this.Controls.Add(grid); 

     this.FormClosing += new FormClosingEventHandler(Form1_FormClosing); 
     } 

     void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
     // make sure its updated 
     InsuranceDetails c = _myClient.InsurDetailz; 
     string name = _myClient.Name; 
     // Place breakpoint here to see the changes in _myClient 
     throw new NotImplementedException(); 
     } 
    } 

    class ClientInfo 
    { 
     public string Name { get; set; } 
     public InsuranceDetails InsurDetailz { get; set; } 
    } 

    class InsuranceDetails 
    { 
     public int InsuranceTypeID { get; set; } 
     public String ItType { get; set; } 
     public InsuranceDetails Self { get { return this; } } 

     public InsuranceDetails(int typeId, String itType) 
     { 
     this.InsuranceTypeID = typeId; 
     this.ItType = itType; 
     } 
    } 
+0

Il segreto è la proprietà 'Self'. –

5

ho avuto un simile (credo) problema, e la soluzione per me è stato quello di impostare la DataSource per il DataGridViewComboBoxColumnprima impostare il DataSource per il DataGridView.

Nel mio caso, il mio DataSources sono una List<T> e un BindingList<T> rispettivamente ma dovrebbe funzionare lo stesso con DataTables:

DataGridViewComboBoxColumn categoryColumn = (DataGridViewComboBoxColumn)_ItemsGrid.Columns["CategoryID"]; 
categoryColumn.DataSource = categories; 

_ItemsGrid.DataSource = items; 
+0

Purtroppo questo non ha aiutato. –

+0

Questo mi ha aiutato molto quando si utilizza Eloquera e si associa una classe complessa a un datagrid. Grazie! – Sverker84

+0

Questo ha funzionato per me. Grazie! –

Problemi correlati