2011-10-05 31 views
5

Estoy tratando de configurar algo en un DataGridView. Parece que esto debería ser bastante sencillo, pero estoy teniendo problemas. Quiero mostrar tres columnas:DataGridViewComboBoxColumn DataSource?

  • CodeID
  • nombre en clave
  • ComboBox con DisplayMember TypeName, ValueMember de TypeID

Quiero ser capaz de seleccionar entre todos los valores posibles de TypeName. Aquí está mi dilema:

Si se me carga todo esto en una sola DataTable y establecer el DataGridView como el DataSource, puedo mostrar la TypeName existente para ese registro, pero el cuadro combinado no incluirá ningún otro valor. Si configuro DataSource para DataGridViewComboBoxColumn en un DataTable que incluye todos los posibles TypeNames, no se muestra el valor existente.

DataGridView es realmente molesto trabajar así que una solución para esto o una alternativa viable sería apreciada.

Editar: parece que el problema es causado por mi deseo de tener un artículo por separado para DisplayMember y ValueMember. Las siguientes obras, si no se preocupan acerca de la configuración del ID como el ValueMember:

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

Si hago lo siguiente, se seleccionan los tipos correctos, pero no puede cambiar la selección en el cuadro combinado:

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

Si utilizo el siguiente recibo un error de FormatException, ya que está tratando de llenar:

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

edi t: typeList es un simple DataTable poblado por lo siguiente:

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

Es usted la creación del DataPropertyName en el DGVCBC? Además, ícono de perfil épico. http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/952b1cc9-4ba7-4b16-abdf-be2cdfde6460/ –

+0

Sí ... ver mi edición. –

+0

¿Puede publicar cómo configura 'typeList' y la estructura que está agregando a la lista? Los tipos de 'DataPropertyName' y' ValueMember' deben ser los mismos, lo cual es probablemente la razón por la que está obteniendo la excepción en el último ejemplo. – SwDevMan81

Respuesta

3

Ok, me ocurrió con un ejemplo ClientInfo y InsuranceDetails que creo que podría imitar lo estás tratando de hacer Avíseme si estos detalles no son del todo correctos. En este ejemplo se rellenará el DataGridViewComboBox y establecer el valor basado en el InsuranceDetails (específicamente en: 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

El secreto es la propiedad 'Self'. –

5

que tenían un similar (creo) problema, y ​​la solución para mí fue para establecer el DataSource para la DataGridViewComboBoxColumnantes establecer el DataSource de el DataGridView.

En mi caso, mis DataSources son un List<T> y una BindingList<T>, respectivamente, pero debería funcionar lo mismo con tablas de datos:

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

_ItemsGrid.DataSource = items; 
+0

Desafortunadamente esto no ayudó. –

+0

Esto me ayudó mucho al usar Eloquera y vincular algunas clases complejas a una cuadrícula de datos. ¡Gracias! – Sverker84

+0

Esto funcionó para mí. ¡Gracias! –

Cuestiones relacionadas