none
Vb Net Datagridview ComboBox item auswählen RRS feed

  • Frage

  • Zuerst erstelle ich ein Datagridview aus einer Tabelle

    Dgv_Leistungsdaten.DataSource = LeistunsgdatenTable


    Dann füre ich eine Combox hinzu und setze dabeo eine separate Datasource

    Dim col_Messger As New DataGridViewComboBoxColumn With col_Messger .HeaderText = "Messgerät" .Name = "Messgeraet"

              .DataSource = temptable_dt
              .DisplayMember = "Bezeichnung_Seriennr"
              .ValueMember = "Geraete_ID"

    .DataPropertyName = "Geraete_ID"

            End Wit

    Dann werden ein paar Spalten ausgeschaltet, redonly gesetzt oder die Breite angepasst

    Als nächstes versuche ich einen Eintrga aus der Combox auszuwählen, welche abhängig ist von einer anderen Spalte aus den Datagridview

              Dim cell As DataGridViewComboBoxCell = DirectCast(Dgv_Leistungsdaten.Rows(n_xpi).Cells("Messgeraet"), DataGridViewComboBoxCell)
              'For i_xpi = 0 To cell.Items.Count - 1
              '  If cell. = Dgv_Leistungsdaten.Rows(n_xpi).Cells(4).Value.ToString Then
              '    Dgv_Leistungsdaten.Rows(n_xpi).Cells("Messgeraet").Value = cell.Items(i_xpi).ToString
              '  End If
              'Next i_xpi
              With cell
                .Value = Dgv_Leistungsdaten.Rows(n_xpi).Cells(4).Value.ToString
              End With
              Dgv_Leistungsdaten.Rows(n_xpi).Cells("Messgeraet").Value = Dgv_Leistungsdaten.Rows(n_xpi).Cells(4).Value.ToString
              Dgv_Leistungsdaten.UpdateCellValue(17, n_xpi)
              Dgv_Leistungsdaten.Invalidate()
              Dgv_Leistungsdaten.Refresh()

    Leider scheitert es, es wirg keinEintrag ausgewählt.

    Ich habe ausgführlich gesucht und auch viele Beiträge gelesen, ohne Erfolg

    Ich verwende Visual Studuo 2017

    Solte noch etwas unklar sein, bitte einfa


    • Bearbeitet PedroLopesdaCosta Mittwoch, 20. Januar 2021 09:17 added DataPropertyName
    Dienstag, 19. Januar 2021 15:39

Antworten

  • Hi,
    zur Demo teste mal das folgende Mini-Programm. Einfach in eine leere Form kopieren:

    Imports System.Collections.ObjectModel
    
    Public Class Form13
      Private Sub Form13_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(dgv)
        dgv.Columns.Add(New DataGridViewTextBoxColumn _
          With {.HeaderText = "Master Info",
          .DataPropertyName = "MasterInfo"})
        dgv.Columns.Add(New DataGridViewComboBoxColumn _
          With {.HeaderText = "Lookup Data",
          .DataPropertyName = "FK",
          .DataSource = colLookUp,
          .DisplayMember = "Text",
          .ValueMember = "ID"})
        dgv.DataSource = colData
      End Sub
    
      Private dgv As New DataGridView With {.Dock = DockStyle.Fill, .AutoGenerateColumns = False}
    
      Public Sub New()
        Dim rnd As New Random
        For i = 1 To 10
          colData.Add(New Data With {.FK = rnd.Next(1, 5), .MasterInfo = $"MasterInfo {i}"})
        Next
        For i = 1 To 4
          colLookUp.Add(New LookUpData With {.ID = i, .Text = $"Lookup-Text {i}"})
        Next
      End Sub
    
      Private colData As New ObservableCollection(Of Data)
      Private colLookUp As New ObservableCollection(Of LookUpData)
    
      ' DataGrid data
      Public Class Data
        Public Property FK As Integer ' foreign key value
        Public Property MasterInfo As String
      End Class
    
      ' ComboBox list data (lookup data)
      Public Class LookUpData
        Public Property ID As Integer ' Key value
        Public Property Text As String ' text To display In DataGrid (ComboBoxColumn)
      End Class
    
    End Class


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Mittwoch, 20. Januar 2021 17:42
  • Hi Pedro,
    auch mit in einem MdiChild funktioniert es problemlos. Bei dir wird wohl an einer anderen Stelle eine Fehler sein. Hier mal meine Demo, einfach in eine leere Form kopieren und diese From als Start-Form eintragen.

    Imports System.Collections.ObjectModel
    
    Public Class Form14
      Private Sub Form14_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.IsMdiContainer = True
        Dim ch As New Child With {.MdiParent = Me}
        ch.Show()
      End Sub
    
      Public Class Child
        Inherits Form
    
        Private Sub Child_Load(sender As Object, e As EventArgs) Handles MyBase.Load
          Me.Controls.Add(dgv)
          dgv.Columns.Add(New DataGridViewTextBoxColumn _
            With {.HeaderText = "Master Info",
            .DataPropertyName = "MasterInfo"})
          dgv.Columns.Add(New DataGridViewComboBoxColumn _
            With {.HeaderText = "Lookup Data",
            .DataPropertyName = "FK",
            .DataSource = colLookUp,
            .DisplayMember = "Text",
            .ValueMember = "ID"})
          dgv.DataSource = colData
        End Sub
    
        Private dgv As New DataGridView With {.Dock = DockStyle.Fill, .AutoGenerateColumns = False}
    
        Public Sub New()
          Dim rnd As New Random
          For i = 1 To 10
            colData.Add(New Data With {.FK = rnd.Next(1, 5), .MasterInfo = $"MasterInfo {i}"})
          Next
          For i = 1 To 4
            colLookUp.Add(New LookUpData With {.ID = i, .Text = $"Lookup-Text {i}"})
          Next
        End Sub
    
        Private colData As New ObservableCollection(Of Data)
        Private colLookUp As New ObservableCollection(Of LookUpData)
    
        ' DataGrid data
        Public Class Data
          Public Property FK As Integer ' foreign key value
          Public Property MasterInfo As String
        End Class
    
        ' ComboBox list data (lookup data)
        Public Class LookUpData
          Public Property ID As Integer ' Key value
          Public Property Text As String ' text To display In DataGrid (ComboBoxColumn)
        End Class
    
      End Class
    
    End Class


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 21. Januar 2021 13:42

Alle Antworten

  • Hi,
    und was ist der Eigenschaft "DataPropertyName" zugewiesen?

    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Dienstag, 19. Januar 2021 16:22
  • Hallo.

    Ja, ist auch auf

    "Bezeichnung_Seriennr"

    als auch auf

    "Geraete_ID"

    eingestellt wordem aber der Eintrag aus der Liste wird dennoch nicht ausgewählt. die combobox ist gefüllt, dennoch wird der Eintrag aus der Tablle

    "Geraete_ID"

    nicht ausgewählt.

    ich abe zusätzlich npoch ersucht die Hintergrundfarbe zu ändern.

    .Style.BackColor = System.Drawing.Color.White

    aber auch das wird nicht übernommen.

     

     

    So insgesamt glaube ich nicht das die update Kommandos eine Einfluss haben, aber sie geben auch keinen Fehler

    • Bearbeitet PedroLopesdaCosta Mittwoch, 20. Januar 2021 12:39 zusätzliche Informationen
    Mittwoch, 20. Januar 2021 09:07
  • Hi,
    zur Demo teste mal das folgende Mini-Programm. Einfach in eine leere Form kopieren:

    Imports System.Collections.ObjectModel
    
    Public Class Form13
      Private Sub Form13_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.Add(dgv)
        dgv.Columns.Add(New DataGridViewTextBoxColumn _
          With {.HeaderText = "Master Info",
          .DataPropertyName = "MasterInfo"})
        dgv.Columns.Add(New DataGridViewComboBoxColumn _
          With {.HeaderText = "Lookup Data",
          .DataPropertyName = "FK",
          .DataSource = colLookUp,
          .DisplayMember = "Text",
          .ValueMember = "ID"})
        dgv.DataSource = colData
      End Sub
    
      Private dgv As New DataGridView With {.Dock = DockStyle.Fill, .AutoGenerateColumns = False}
    
      Public Sub New()
        Dim rnd As New Random
        For i = 1 To 10
          colData.Add(New Data With {.FK = rnd.Next(1, 5), .MasterInfo = $"MasterInfo {i}"})
        Next
        For i = 1 To 4
          colLookUp.Add(New LookUpData With {.ID = i, .Text = $"Lookup-Text {i}"})
        Next
      End Sub
    
      Private colData As New ObservableCollection(Of Data)
      Private colLookUp As New ObservableCollection(Of LookUpData)
    
      ' DataGrid data
      Public Class Data
        Public Property FK As Integer ' foreign key value
        Public Property MasterInfo As String
      End Class
    
      ' ComboBox list data (lookup data)
      Public Class LookUpData
        Public Property ID As Integer ' Key value
        Public Property Text As String ' text To display In DataGrid (ComboBoxColumn)
      End Class
    
    End Class


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Mittwoch, 20. Januar 2021 17:42
  • Hallo, es scheint ein Bug  mit dem mdi zu sein, wenn man das im mdichild ausführt geht es nicht.

    Ich habe es alsProblem gemeldet https://developercommunity2.visualstudio.com/t/VS-2017-VB-Net-Dtagriidview-Combobox-Ite/1315390

    Daher danke

    Donnerstag, 21. Januar 2021 13:11
  • Hi Pedro,
    auch mit in einem MdiChild funktioniert es problemlos. Bei dir wird wohl an einer anderen Stelle eine Fehler sein. Hier mal meine Demo, einfach in eine leere Form kopieren und diese From als Start-Form eintragen.

    Imports System.Collections.ObjectModel
    
    Public Class Form14
      Private Sub Form14_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.IsMdiContainer = True
        Dim ch As New Child With {.MdiParent = Me}
        ch.Show()
      End Sub
    
      Public Class Child
        Inherits Form
    
        Private Sub Child_Load(sender As Object, e As EventArgs) Handles MyBase.Load
          Me.Controls.Add(dgv)
          dgv.Columns.Add(New DataGridViewTextBoxColumn _
            With {.HeaderText = "Master Info",
            .DataPropertyName = "MasterInfo"})
          dgv.Columns.Add(New DataGridViewComboBoxColumn _
            With {.HeaderText = "Lookup Data",
            .DataPropertyName = "FK",
            .DataSource = colLookUp,
            .DisplayMember = "Text",
            .ValueMember = "ID"})
          dgv.DataSource = colData
        End Sub
    
        Private dgv As New DataGridView With {.Dock = DockStyle.Fill, .AutoGenerateColumns = False}
    
        Public Sub New()
          Dim rnd As New Random
          For i = 1 To 10
            colData.Add(New Data With {.FK = rnd.Next(1, 5), .MasterInfo = $"MasterInfo {i}"})
          Next
          For i = 1 To 4
            colLookUp.Add(New LookUpData With {.ID = i, .Text = $"Lookup-Text {i}"})
          Next
        End Sub
    
        Private colData As New ObservableCollection(Of Data)
        Private colLookUp As New ObservableCollection(Of LookUpData)
    
        ' DataGrid data
        Public Class Data
          Public Property FK As Integer ' foreign key value
          Public Property MasterInfo As String
        End Class
    
        ' ComboBox list data (lookup data)
        Public Class LookUpData
          Public Property ID As Integer ' Key value
          Public Property Text As String ' text To display In DataGrid (ComboBoxColumn)
        End Class
    
      End Class
    
    End Class


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Donnerstag, 21. Januar 2021 13:42