none
dataGridView - coluna combobox com erro ao clickar no botão dropdown. RRS feed

  • Pergunta

  • Oiê
    Na coluna combobox do codigo abaixo de teste, quando clicado, no botão dropdown, abre a lista de dados filtrados, porém ao sair do evento beginEdit dá um erro que não consigo encontrar, podem dar uma mãozinha para debugar, pois estou dependendo da solução deste problema para dar sequencia ao projeto onde utilizarei este cenário muitas vezes.
    O que pude observar é que o evento _celEndEdit  EM VERMELHO não está ressetando o bindingSource territoriesBS, pdem me dizer porquê?.
    grato
    takeo
    Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Windows.Forms
    Imports System.Collections.Generic
    Imports System.Drawing

    Public Class Form1
        Private territoriesBS As New BindingSource
        Private regionBS As New BindingSource
        Private m_cbxTerritories As DataGridViewComboBoxColumn

        Private Sub form1_Load( _
                ByVal sender As Object, _
                ByVal e As System.EventArgs) _
                Handles Me.Load

            Dim strcon As String = "data source=MAQTAKEO;initial catalog=northwind;integrated security=true"
            Dim objcon As New SqlConnection(strcon)
            Dim ds As New DataSet
            Dim strCmd1 As String = "SELECT * FROM territories"
            Dim strCmd2 As String = "SELECT * FROM region"

            Dim adpTerritories As New SqlDataAdapter(strCmd1, objcon)
            Dim adpRegion As New SqlDataAdapter(strCmd2, objcon)
            objcon.Open()
            adpRegion.Fill(ds, "Region")
            adpTerritories.Fill(ds, "territories")

            ' Setup BindingSource for filtered view.


            Dim dv As DataView = New DataView(ds.Tables("region"))
            regionBS.DataSource = dv
            objcon.Close()
            dgv1.DataSource = regionBS

           
            ' hide the auto-generated regionId column.
            dgv1.Columns("regionId").Visible = False

            Dim dv1 As DataView = New DataView(ds.Tables("territories"))
            territoriesBS = New BindingSource
            territoriesBS.DataSource = dv1

            'seta a posição da coluna no datagridview.
            m_cbxTerritories = New DataGridViewComboBoxColumn
            m_cbxTerritories.DisplayIndex = 2
            m_cbxTerritories.HeaderText = "territories"

            ' This column is bound to the Products.CategoryID field.
            m_cbxTerritories.DataPropertyName = "regionId"
      
            ' Esta coluna é linkado para o campo terriories description.
            m_cbxTerritories.DataSource = territoriesBS
            m_cbxTerritories.DisplayMember = "TerritoryDescription"
            m_cbxTerritories.ValueMember = "RegionID"
            ' Add the column.
            dgv1.Columns.Add(m_cbxTerritories)
        End Sub

        Private Sub dgv1_CellBeginEdit( _
                   ByVal sender As Object, _
                   ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) _
                   Handles dgv1.CellBeginEdit

            If (e.ColumnIndex = m_cbxTerritories.Index) Then

                ' Set the combobox cell datasource to the filtered BindingSource
                Dim dgcb As DataGridViewComboBoxCell = CType(dgv1(e.ColumnIndex, e.RowIndex), DataGridViewComboBoxCell)
                dgcb.DataSource = territoriesBS

                ' Filter the BindingSource based upon the region selected
                Me.territoriesBS.Filter = "RegionID = " & dgv1((e.ColumnIndex - 2), e.RowIndex).Value.ToString

            End If

        End Sub

        Private Sub dgv1_CellEndEdit( _
                   ByVal sender As Object, _
                  ByVal e As DataGridViewCellEventArgs) _
                  Handles dgv1.CellEndEdit
            If (e.ColumnIndex = m_cbxTerritories.Index) Then
                ' Reset combobox cell to the unfiltered BindingSource
                Dim dgcb As DataGridViewComboBoxCell = CType(dgv1(e.ColumnIndex, e.RowIndex), DataGridViewComboBoxCell)
                dgcb.DataSource = territoriesBS
                'unfiltered()
                '     Me.territoriesBS.RemoveFilter()
            End If
        End Sub

    End Class



    domingo, 6 de janeiro de 2008 12:52

Respostas

  • Oi Gente
    Quero complementar o post anterior. O evento cellEndEdit, que está em vermelho no post anterior é disparado quando se clica em outra célula ou mesmo dentro da mesma célula para sair, então quando clicar por ex, quando dou um clik numa célula do combobox, é disparado o evento cellBeginEdit onde faço a filtro dos dados que é efetuado, mas automaticamente o framework varre todas as celulas da coluna combobox, aí dá o erro por que ainda op cellEndEdit não foi disparado. Logo tenho que achar uma alternativa para ressetar o dataSource sem o filtro, de modo que o framework possa fazer seu papel corretamente. Porem n/ao encontrei como, alguem tem alguma sugest/ao?
    takeo .
    segunda-feira, 7 de janeiro de 2008 15:22
  • Oi gente
    acabei descobrindo como fazer funcionar o filtro ao clickar no botão drodownlist do cbx. No evento CellVeginEdit
    faço uma chamada de uma query selecionada por parametro e atualizo o bindingsource, e no evento CellEndEdit atualizo o bindingsource com a fonte original. Funcionou perfeito.
    até mais
    takeo
    quinta-feira, 24 de janeiro de 2008 19:27

Todas as Respostas

  • Oi Gente
    Quero complementar o post anterior. O evento cellEndEdit, que está em vermelho no post anterior é disparado quando se clica em outra célula ou mesmo dentro da mesma célula para sair, então quando clicar por ex, quando dou um clik numa célula do combobox, é disparado o evento cellBeginEdit onde faço a filtro dos dados que é efetuado, mas automaticamente o framework varre todas as celulas da coluna combobox, aí dá o erro por que ainda op cellEndEdit não foi disparado. Logo tenho que achar uma alternativa para ressetar o dataSource sem o filtro, de modo que o framework possa fazer seu papel corretamente. Porem n/ao encontrei como, alguem tem alguma sugest/ao?
    takeo .
    segunda-feira, 7 de janeiro de 2008 15:22
  • Oi gente
    acabei descobrindo como fazer funcionar o filtro ao clickar no botão drodownlist do cbx. No evento CellVeginEdit
    faço uma chamada de uma query selecionada por parametro e atualizo o bindingsource, e no evento CellEndEdit atualizo o bindingsource com a fonte original. Funcionou perfeito.
    até mais
    takeo
    quinta-feira, 24 de janeiro de 2008 19:27