У меня есть DataGridview
с источником данных, установленным в datatable, заполненном из таблиц базы данных. В DataGridView
у меня есть столбец ComboBox
, который заполняется из таблицы в базе данных. У меня есть обработчик событий, который стреляет по .SelectedIndexChange
из ComboBox
.Столбец DataGridViewComboBox с несколькими рядами
У меня возникли 2 проблемы:
- Когда
ComboBox
изменяется пожаров событий, как предполагалось; однако выбранное значение не отображается вComboBox
. Если значение изменено, оно не срабатывает снова. Я требую, чтобы выбранный индекс изменялся каждый раз, когда значение было изменено. - После того, как вы изменили одно поле со списком и событие было запущено, ни одна из других строк не загорелась обработчиком событий. Я напугаю, что это довольно просто, и я пропускаю что-то очень простое, но любая помощь будет оценена по достоинству.
Форма с DGV код:
Imports System.Data.SqlClient
Public Class ComponentQForm
Private Sub ComponentQForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
FillDataTableComponentForm()
DataGridView1.ColumnHeadersVisible = True
Dim columnHeaderStyle As New DataGridViewCellStyle()
columnHeaderStyle.BackColor = Color.Beige
columnHeaderStyle.Font = New Font("Verdana", 10, FontStyle.Bold)
DataGridView1.ColumnHeadersDefaultCellStyle = columnHeaderStyle
DataGridView1.DataSource = DataTableComponentForm
CreateCboColumn()
DataGridView1.Columns.Add(cbosupplier)
End Sub
Private Sub DataGridView1_EditingControlShowing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
If DataGridView1.CurrentCell.ColumnIndex = 3 Then
Dim combo As ComboBox = CType(e.Control, ComboBox)
If (combo IsNot Nothing) Then
RemoveHandler combo.SelectedIndexChanged, New EventHandler(AddressOf ComboBox_SelectedIndexChanged)
AddHandler combo.SelectedIndexChanged, New EventHandler(AddressOf ComboBox_SelectedIndexChanged)
End If
End If
End Sub
Private Sub ComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim combo As ComboBox = CType(sender, ComboBox)
combo.SelectedIndex = combo.SelectedIndex
Dim comboVal As Integer = combo.SelectedIndex + 1
Dim strSQl3 As String = "SELECT tblSuppliers.Company "
strSQl3 = strSQl3 & "FROM tblSuppliers "
strSQl3 = strSQl3 & "WHERE tblSuppliers.Id = "
strSQl3 = strSQl3 & comboVal
Dim sel1 As New SqlCommand(strSQl3, MyCn)
Dim comboValue As String
comboValue = sel1.ExecuteScalar().ToString()
Dim itemNumber As String = DataGridView1.CurrentRow.Cells(0).Value
GetCostETA(comboValueP:=comboValue, itemNumberP:=itemNumber)
AddCost()
AddETA()
AddTotal()
Populating()
End Sub
End Class
Модуль процедур:
Imports System.Data.SqlClient
Module ComponentQuoteProcedure
Public DataTableComponentForm As New DataTable
Public DataTableComponentForm2 As New DataTable
Public DataAdpCompForm As New SqlDataAdapter
Public comboValue As String
Public cbosupplier As New DataGridViewComboBoxColumn()
Public Sub FillDataTableComponentForm()
OpenDBCon()
OpenConSuppliers()
Dim strSQl As String
strSQl = "SELECT tbl200AV.ItemNumber, " & _
"tblComponents.PartNumber, " & _
"tbl200AV.Quantity " & _
"FROM tbl200AV, tblComponents " & _
"WHERE tbl200AV.ItemNumber = tblComponents.ItemNumber"
Dim sel As New SqlCommand(strSQl, MyCn)
DataAdpCompForm.SelectCommand = sel
DataAdpCompForm.Fill(DataTableComponentForm)
DataAdpCompForm.Dispose()
End Sub
Public Sub CreateCboColumn()
Dim itemscount As Integer = MyDataTblSuppliers.Rows.Count - 1
cbosupplier.HeaderText = "Supplier"
cbosupplier.Name = "Supplier"
cbosupplier.MaxDropDownItems = itemscount
cbosupplier.DataSource = MyDataTblSuppliers
cbosupplier.DisplayMember = "Company"
End Sub
Public Sub GetCostETA(ByVal comboValueP As String, ByVal itemNumberP As Integer)
Dim strSQl2 As String = "SELECT tblCompSup.ItemNumber, "
strSQl2 = strSQl2 & "tblCompSup.CostPrice, "
strSQl2 = strSQl2 & "tblCompSup.ETA "
strSQl2 = strSQl2 & "FROM tblCompSup, tbl200AV "
strSQl2 = strSQl2 & "WHERE '"
strSQl2 = strSQl2 & itemNumberP
strSQl2 = strSQl2 & "' = tblCompSup.ItemNumber "
strSQl2 = strSQl2 & "AND tblCompSup.Supplier LIKE '"
strSQl2 = strSQl2 & comboValueP
strSQl2 = strSQl2 & "'"
Dim sel As New SqlCommand(strSQl2, MyCn)
DataAdpCompForm.SelectCommand = sel
DataAdpCompForm.Fill(DataTableComponentForm2)
End Sub
Public Sub AddCost()
If Not DataTableComponentForm.Columns.Contains("CostPrice") Then
DataTableComponentForm.Columns.Add("CostPrice")
End If
End Sub
Public Sub AddETA()
If Not DataTableComponentForm.Columns.Contains("ETA") Then
DataTableComponentForm.Columns.Add("ETA")
End If
End Sub
Public Sub AddTotal()
If Not DataTableComponentForm.Columns.Contains("TotalPrice") Then
DataTableComponentForm.Columns.Add("TotalPrice")
End If
End Sub
Public Sub Populating()
Dim newRow() As Data.DataRow
Dim itemNumber As Integer = DataTableComponentForm2.Rows(0).Item("ItemNumber")
newRow = DataTableComponentForm.Select("ItemNumber = '" & itemNumber & "'")
Dim cost As Decimal = DataTableComponentForm2.Rows(0).Item("CostPrice")
Dim eta As Integer = DataTableComponentForm2.Rows(0).Item("ETA")
Dim quant As Integer = DataTableComponentForm.Rows(0).Item("Quantity")
Dim total As Decimal = quant * cost
newRow(0)("CostPrice") = cost
newRow(0)("ETA") = eta
newRow(0)("TotalPrice") = total
End Sub
End Module
уменьшаем количество кода, который вы публикуете, пытаясь себя лучше точно определить причины местоположение проблемы. Для этого используйте отладчик. – Thomas
Я нашел причину проблемы, но не смог найти решение. Проблема в том, что при первом запуске selectedindexchange все работает нормально, но когда он активируется во второй раз при изменении combobox, переменная itemNumber возвращает пустой. Почему это происходит только после того, как это впервые произойдет? –
Возможно, это связано с тем, что ваш ComboBox является локальным, а не классом. Я сейчас на телефоне. Я посмотрю более подробно на компьютер, позже – Thomas