2014-10-10 6 views
0

У меня есть DataGridview с источником данных, установленным в datatable, заполненном из таблиц базы данных. В DataGridView у меня есть столбец ComboBox, который заполняется из таблицы в базе данных. У меня есть обработчик событий, который стреляет по .SelectedIndexChange из ComboBox.Столбец DataGridViewComboBox с несколькими рядами

У меня возникли 2 проблемы:

  1. Когда ComboBox изменяется пожаров событий, как предполагалось; однако выбранное значение не отображается в ComboBox. Если значение изменено, оно не срабатывает снова. Я требую, чтобы выбранный индекс изменялся каждый раз, когда значение было изменено.
  2. После того, как вы изменили одно поле со списком и событие было запущено, ни одна из других строк не загорелась обработчиком событий. Я напугаю, что это довольно просто, и я пропускаю что-то очень простое, но любая помощь будет оценена по достоинству.

Форма с 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 
+0

уменьшаем количество кода, который вы публикуете, пытаясь себя лучше точно определить причины местоположение проблемы. Для этого используйте отладчик. – Thomas

+0

Я нашел причину проблемы, но не смог найти решение. Проблема в том, что при первом запуске selectedindexchange все работает нормально, но когда он активируется во второй раз при изменении combobox, переменная itemNumber возвращает пустой. Почему это происходит только после того, как это впервые произойдет? –

+0

Возможно, это связано с тем, что ваш ComboBox является локальным, а не классом. Я сейчас на телефоне. Я посмотрю более подробно на компьютер, позже – Thomas

ответ

0

Есть слишком много вещей, которые могут быть причиной проблемы. К сожалению, я недостаточно эксперт, чтобы определить проблему. Тем не менее, вот некоторые вещи, которые вызывают мои подозрения:

  1. Ваше место размещения combo и область действия. В исходном сообщении код показывает, что объект combo объявлен и создан на локальном уровне, например. внутри тела метода. Это означает, что как только тело метода осталось, combo больше не существует.
  2. Вы пытаетесь обработать события локального объекта области (combo) за пределами области действия объекта. Кроме того, обработчик события не указывает, к какому объекту прослушивает обработчик события, например. Handles combo.[Event]
  3. У вас есть какие-то конфликты имен, которые также могут быть причиной некоторых дальнейших вопросов:

От оригинального поста:

Dim combo As ComboBox = CType(sender, ComboBox) 
combo.SelectedIndex = combo.SelectedIndex ' Which combo is receiving 
              ' which combo's SelectedIndex? 
Смежные вопросы