0

j'ai chargé un DataGridView appelé dgvPrint avec une liste qui récupère la base de données comme suit:Comment changer le type de colonne DataGridView après la liaison

dgvPrint.DataSource = ReservedServices.GetAll(); 

Le résultat est comme ci-dessous:

initial data

Colonne

Worker et colonne ServiceType sont des entiers qui se réfèrent aux clés primaires de deux tables.

Comment puis-je modifier le type de colonne ServiceType et Worker du texte simple au DataGridViewComboBoxColumn?

Remarque1: Les valeurs actuelles de ces deux colonnes sont les ValueMember des zones de liste déroulante correspondantes.

Note2: Je souhaite conserver les données et les positions d'autres colonnes.

J'ai utilisé ce code pour Worker colonne, mais il ne fonctionne pas correctement:

DataGridViewComboBoxColumn colbox; 
colbox = (DataGridViewComboBoxColumn)dgvPrintServices.Columns[4]; 
colbox.DataSource = WorkerServices.GetAll(); // a list of worker with Id and Name 
colbox.DisplayMember = "Name"; 
colbox.ValueMember = "Id"; 
dgvPrint.Columns.Add(colbox); 
+0

Alors vous voulez aussi voir le Combobox en mode lecture? –

+0

En fait NON, en particulier je veux changer le travailleur –

+0

Donc, vous obtenez actuellement un TextBox lorsque vous modifiez la colonne travailleur? –

Répondre

0

Vous devez abord définir et ajouter des colonnes à DataGridView (soit en utilisant l'interface graphique en VS ou par code comme par exemple ci-dessous), définissant un .DataPropertyName correct. Une de ces colonnes sera la colonne Travailleur, qui aura également du code supplémentaire, le code que vous avez indiqué dans votre message. Et puis ajoutez la source de données. En d'autres termes, je pense que votre code est correct, mais l'ordre d'assignation de la source de données et la définition des propriétés des colonnes doivent changer.

VB.NET:

With WIcol4 
     .Width = "120" 
     .HeaderText = "Worker" 
     .DataPropertyName = "Worker" 
     .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft 
     .DefaultCellStyle.Padding = New Padding(0, 0, 6, 0) 
     .DropDownWidth = 300 
     .Name = .DataPropertyName 
     .DataSource = dtWorker 
     .ValueMember = "ID" 
     .DisplayMember = "Name" 
     .ReadOnly = False 
    End With 

    Me.dgwOps.Columns.Add(WIcol4) 

C#:

var _with1 = WIcol4; 
    _with1.Width = "120"; 
    _with1.HeaderText = "Worker"; 
    _with1.DataPropertyName = "Worker"; 
    _with1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft; 
    _with1.DefaultCellStyle.Padding = New Padding(0, 0, 6, 0); 
    _with1.DropDownWidth = 300; 
    _with1.Name = _with1.DataPropertyName; 
    _with1.DataSource = dtWorker; 
    _with1.ValueMember = "ID"; 
    _with1.DisplayMember = "Name"; 
    _with1.ReadOnly = False; 

    this.dgwOps.Columns.Add(WIcol4); 

Notez que pour une colonne à inscriptible, à la fois DataGridView et la colonne doit être ReadOnly = False.