2008-10-22 6 views
0

Les sources de données ont la même structure, mais des données différentes. L'une serait utilisée pour les lignes enregistrées (mode affichage) et l'autre pour les lignes ajoutées ou modifiées (modifier/nouvelles lignes). Comment cela peut-il être accompli?Comment faire une colonne ComboBox avec deux sources de données (pour DataGridView)

J'ai une colonne de clé étrangère standard qui fait référence à une table de recherche standard qui a un ID, un nom et un bit actif. La colonne de zone de liste déroulante utilise cette table de recherche pour afficher la liste, mais uniquement les éléments actifs. Supposons qu'un élément de recherche soit utilisé et désactivé par la suite (Active = 0). La colonne de zone de liste déroulante affiche maintenant des erreurs car l'ID n'est pas trouvé dans la liste. Est-ce que quelqu'un a des idées pour le résoudre?

Répondre

1

Je ne sais pas si vous êtes toujours à la recherche mais je viens de rencontrer le même problème. Voici comment je l'ai abordé, j'espère que cela vous sera utile.

Définir une fonction qui renvoie une DataGridViewComboCell avec l'ensemble de la source de données appropriée (objets de collection définis ailleurs, notez que j'utilise EntitySpaces dans cet exemple pour alimenter le DataSource):

Private Function GetStockComboDataSource(ByVal type As eStockComboType) As DataGridViewComboBoxCell 
     Try 
      Dim cell As New DataGridViewComboBoxCell 
      Select Case type 
       Case eStockComboType.StockIn 

        cell.DataSource = Me.StockInCol.Query.LoadDataTable 
        cell.DisplayMember = "FullName" 
        cell.ValueMember = JCStockInMetadata.ColumnNames.StockItemID 

       Case eStockComboType.StockItem 

        cell.DataSource = StockItemCol.Query.LoadDataTable 
        cell.ValueMember = JCStockItemMetadata.ColumnNames.StockItemID 
        cell.DisplayMember = "FullName" 
      End Select 

      Return cell 
End Function 

Maintenant, quand il s'agit de le réglage de la DataSource combo (j'utilise l'événement RowEnter ici par exemple):

Private Sub dgvStock_RowEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvStock.RowEnter 
     Try 
      If IsNumeric(Me.dgvStock.Rows(e.RowIndex).Cells("ID").Value) Then 
       Dim intValue As Integer = Convert.ToInt32(Me.dgvStock.Rows(e.RowIndex).Cells("Stock Item").Value) 
       Me.dgvStock.Rows(e.RowIndex).Cells("Stock Item") = GetStockComboDataSource(eStockComboType.StockItem) 
       Me.dgvStock.Rows(e.RowIndex).Cells("Stock Item").Value = intValue 
      Else 
       Me.dgvStock.Rows(e.RowIndex).Cells("Stock Item") = GetStockComboDataSource(eStockComboType.StockIn) 

      End If 
     Catch ex As Exception 
      JCExceptionLogger.LogException(ex) 
     End Try 

End Sub 

ici je passe le DataSource combo selon que la colonne ID est numérique, mais vous pouvez mettre en œuvre quelle que soit la logique des affaires dont vous avez besoin. Notez que je sauvegarde la valeur de la cellule avant de définir le combo (intValue). Cela semble être nécessaire sinon le combo s'affichera comme vide.

+0

Cela aide un peu, mais comment puis-je afficher du texte dans la cellule et à DataSource enregistrer la valeur entière (id)? –

+0

Découvrez les propriétés ValueMember et DisplayMember, vous pouvez les utiliser dans ce but précis. – Simon

Questions connexes