none
Qual a melhor maneira de dois formulários diferentes compartilharem um mesmo BindingSource? RRS feed

  • Pergunta

  • Eu estou tentando criar um formulário com um DataGridView e um BindingSource, cujo datasource é uma lista de objetos Transporte. A classe transporte tem algumas propriedades de tipos não primitivos (tipo Cidade, Motorista, etc.):

    Public Class Transporte
        Public Property IdTransporte As Integer
        Public Property Veiculo As Veiculo
        Public Property Motorista As Motorista
        Public Property Setor As Setor
        Public Property Finalidade As String
        Public Property Cidade As Cidade
        Public Property TipoSaida As String
    End Class

    Não quero editar os dados diretamente no DataGridView. Daí eu tive a ideia de criar um formulário à parte (que eu estou chamando de Formulário de Detalhe) para editar um determinado item do BindingSource. Lá há vários ComboBox, um para cada propriedade não primitiva da classe Transporte. Cada ComboBox tem como DataSource uma lista do seu tipo respectivo (por exemplo: o combo da Cidade recebe uma lista de Cidades como datasource).

    Eu consegui fazer a amarração dos dados do BindingSource do DataGridView aos combos do Formulário de Detalhe e ALTERAR o elemento atual do BindingSource. Quando eu tento INCLUIR um novo elemento no BindingSource é que dá problema: depois que os combos estão preenchidos e um dos TextBox perde o foco, a seleção nos combos simplesmente é apagada

    Segue o código do formulário com o DataGridView:

        Private Sub Incluir() Handles BindingNavigatorAddNewItem.Click
            bs.AddNew() 'Acrescento um novo elemento no BindingSource usado pelo DataGridView
            Dim f = FabricaFormularioDetalhesCRUD.criarFormDetalhes(Transporte, dal, bs, True) ' Chamo o formulário de detalhes no modoInclusao como True
    'O objeto dal tem métodos CRUD, pra mexer no BD depois que eu confirmar as alterações.
            f.StartPosition = FormStartPosition.CenterScreen
            f.ShowDialog(Me)
        End Sub

    O código do Formulário de Detalhes do Transporte: 

    Imports DAL
    Imports Modelo
    
    Public Class FormDetalhesTransporte
    
        Private dal As IMecanismoPersistencia
        Private bs As BindingSource
        Private modoInclusao As Boolean
    
        Private dalVeiculo As IMecanismoPersistencia = FabricaPersistencia.criar(GetType(Veiculo))
        Private dalSetor As IMecanismoPersistencia = FabricaPersistencia.criar(GetType(Setor))
        Private dalMotorista As IMecanismoPersistencia = FabricaPersistencia.criar(GetType(Motorista))
        Private dalCidade As IMecanismoPersistencia = FabricaPersistencia.criar(GetType(Cidade))
    
        Private Sub New(dal As IMecanismoPersistencia, bs As BindingSource, modoInclusao As Boolean)
            InitializeComponent()
            Me.dal = dal
            Me.bs = bs
            Me.modoInclusao = modoInclusao
            ligarControles(bs)
        End Sub
    
        Private Sub ligarControles(bs As BindingSource)
            IdTransporteTextBox.DataBindings.Add("Text", bs, "IdTransporte")
    
            IdVeiculoComboBox.DataSource = dalVeiculo.Listar()
            IdVeiculoComboBox.DisplayMember = "Placa"
            IdVeiculoComboBox.ValueMember = "IdVeiculo"
            IdVeiculoComboBox.DataBindings.Add("SelectedValue", bs, "Veiculo.IdVeiculo")
    
            IdMotoristaComboBox.DataSource = dalMotorista.Listar
            IdMotoristaComboBox.DisplayMember = "Nome"
            IdMotoristaComboBox.ValueMember = "IdMotorista"
            IdMotoristaComboBox.DataBindings.Add("SelectedValue", bs, "Motorista.IdMotorista")
    
            IdSetorComboBox.DataSource = dalSetor.Listar
            IdSetorComboBox.DisplayMember = "Sigla"
            IdSetorComboBox.ValueMember = "IdSetor"
            IdSetorComboBox.DataBindings.Add("SelectedValue", bs, "Setor.IdSetor")
    
            FinalidadeTextBox.DataBindings.Add("Text", bs, "Finalidade")
    
            IdCidadeComboBox.DataSource = dalCidade.Listar
            IdCidadeComboBox.DisplayMember = "Nome"
            IdCidadeComboBox.ValueMember = "IdCidade"
            IdCidadeComboBox.DataBindings.Add("SelectedValue", bs, "Cidade.IdCidade")
    
            TipoSaidaComboBox.DataBindings.Add("Text", bs, "TipoSaida")'Este ComboBox é composto por uma lista de Strings.
        End Sub
    
        Public Shared Function getInstance(dal As IMecanismoPersistencia, bs As BindingSource, modoInclusao As Boolean) As FormDetalhesTransporte
            Return New FormDetalhesTransporte(dal, bs, modoInclusao)
        End Function
    
        Private Sub Salvar() Handles btnSalvar.Click
            Dim o = CType(bs.Current, Transporte)
            o.Veiculo = IdVeiculoComboBox.SelectedItem
            o.Motorista = IdMotoristaComboBox.SelectedItem
            o.Setor = IdSetorComboBox.SelectedItem
            o.Cidade = IdCidadeComboBox.SelectedItem
    
            If modoInclusao Then
                dal.Incluir(o)
            Else
                dal.Atualizar(o)
            End If
            Me.Close()
        End Sub
    
    End Class

    Como eu faço pra refletir as alterações do Formulário de Detalhe no DataGridView do formulário principal? Valeu.


    quarta-feira, 6 de fevereiro de 2013 17:45