Jump to content

Recommended Posts

Posted

Viva,

Criei uma DataGridview na qual tenho 4 colunas. A 4.ª coluna é um ComboBoxColumn em que em cada uma das células desta coluna o utilizador pode escolher, da lista de valores, a seguinte opção: "É Chave" (pois, só tem uma opção porque para este caso não vale a pena ter a opção "Não Chave").

Precisava da vossa ajuda para que, a partir do momento que uma célula desta coluna já tivesse a informação "É Chave" não aparecesse mais a possibilidade de inserir nas outras células "É Chave". Só se na célula que que já "É Chave" fosse retirada esta informação.

O código que tenho é o seguinte:

Private Sub AdicionarComboBoxColumns()

        Dim comboboxColumn As DataGridViewComboBoxColumn

         comboboxColumn = CriarComboBoxColumn()

        SetUsingItems(comboboxColumn)

        comboboxColumn.HeaderText = _

            "Chave_Primaria"

        tabelaDataGridView.Columns.Add(comboboxColumn)

    End Sub
Private Function CriarComboBoxColumn() _

        As DataGridViewComboBoxColumn

        Dim column As New DataGridViewComboBoxColumn()

        With column

            .FlatStyle = FlatStyle.Flat

        End With

        Return column

    End Function
Private Shared Sub SetUsingItems( _

        ByVal comboboxColumn As DataGridViewComboBoxColumn)

        comboboxColumn.Items.AddRange("É Chave!")

    End Sub

Agradeço desde já a ajuda  🙂

Posted

Não. Se numa linha já estiver inserido na 4.ª coluna "É Chave!", nas outras linhas na 4.ª coluna já não pode aparecer esta escolha, como podes ver pela seguinte imagem:

http://img638.imageshack.us/img638/9255/tabelarx.jpg

Agora nas restantes linhas, e uma vez que já indiquei na primeira que é campo chave, não poderá aparecer esta possibilidade, a não ser que o utilizador regresse outra vez à primeira linha e apague "É chave!" (mas também já verifiquei que, uma vez inserido "É Chave!" da lista de valores, já não consigo apagar o valor desta célula  ? ).

Não sei se me fiz entender. Qual será a melhor forma para implementar isto?

Posted

Tens de adicionar todos os itens possíveis a ComboBox, depois tens de utilizar o evento EditingControlShowing da DataGridView para limitar os itens disponíveis, ai tens de verificar se alguma das linhas já tem esse item adicionado, se sim, não o mostras.

Pedro Martins

Não respondo a duvidas por PM

Posted

Não domino isto.

Já coloquei todos os itens à ComboBox, como indicaste, e iniciei com este código.

Private Sub tabelaDataGridView_EditingControlShowing(ByVal sender As Object, _
      ByVal e As DataGridViewEditingControlShowingEventArgs) _
      Handles tabelaDataGridView.EditingControlShowing
          For Each L As DataGridViewRow In Me.tabelaDataGridView.Rows
              If L.IsNewRow Then Exit For
               IF e.control. = .....SERÀ?            
          Next

    
    End Sub

Podes-me ajudar com algum código?

Posted

Será tipo isto

        If TypeOf e.Control Is System.Windows.Forms.DataGridViewComboBoxEditingControl Then
            For Each L As DataGridViewRow In Me.tabelaDataGridView.Rows
                If L.IsNewRow Then Exit For
                If L.Cells(3).Value = "É Chave!" Then
                    Dim L As New List(Of String)

                    'Só deixo que estes sejam mostrados, deves adicionar todos menos o "É Chave!"
                    L.Add("Opção 1")
                    L.Add("Opção 2")
                    L.Add("Opção 3")

                    Dim C As System.Windows.Forms.ComboBox = CType(e.Control, System.Windows.Forms.ComboBox)
                    C.DataSource = L

                    Exit For
                End If
            Next

        End If

Pedro Martins

Não respondo a duvidas por PM

  • 2 weeks later...
Posted

Viva,

Reparei agora que uma outra ComboBoxColumn que tenho está a assumir na sua lista de valores, os valores que vêm desta ComboBox, depois do utilizador seleccionar, dentro da lista de valores, o valor "Chave".

Como poderei solucionar esta situação? O código até agora é o seguinte:


Private Sub tabelaDataGridView_EditingControlShowing(ByVal sender As Object, _

    ByVal e As DataGridViewEditingControlShowingEventArgs) _

    Handles tabelaDataGridView.EditingControlShowing

        If TypeOf e.Control Is System.Windows.Forms.DataGridViewComboBoxEditingControl Then

            For Each M As DataGridViewRow In Me.tabelaDataGridView.Rows

                If M.IsNewRow Then Exit For

                If M.Cells(3).Value = "É Chave!" Then

                    Dim L As New List(Of String)

                    'Só deixo que estes sejam mostrados, deves adicionar todos menos o "É Chave!"

                    L.Add("Não Chave")

                    Dim C As System.Windows.Forms.ComboBox = CType(e.Control, System.Windows.Forms.ComboBox)

                    C.DataSource = L

                    Exit For

                End If

            Next

        End If

    End Sub 

Como poderei fazer com que a lista de valores fique apenas afeta à 4.ª coluna?

Posted

Vais precisar de evento CellBeginEdit para apanhares o index, tipo

    Dim IndexColunaQueVaiSerEditada As Integer

    Private Sub DataGridView1_CellBeginEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit
        IndexColunaQueVaiSerEditada = e.ColumnIndex
    End Sub

e depois fazes a verificação, tipo

    Private Sub DataGridView1_EditingControlShowing(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
        If TypeOf e.Control Is System.Windows.Forms.DataGridViewComboBoxEditingControl Then
            If IndexColunaQueVaiSerEditada = 0 Then
                'Faz o que tem a fazer para a coluna 0 
            ElseIf IndexColunaQueVaiSerEditada = 1 Then
                'Faz o que tem a fazer para a coluna 1
            Else
                '...
            End If
        End If
    End Sub

Pedro Martins

Não respondo a duvidas por PM

Posted

Viva. Parece que resolveu. Estive a testar e ficou assim:

Dim IndexColunaQueVaiSerEditada As Integer
  
    Private Sub DataGridView1_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles tabelaDataGridView.CellBeginEdit

        IndexColunaQueVaiSerEditada = e.ColumnIndex

    End Sub
  
    Private Sub tabelaDataGridView_EditingControlShowing(ByVal sender As Object, _

    ByVal e As DataGridViewEditingControlShowingEventArgs) _

    Handles tabelaDataGridView.EditingControlShowing

        If TypeOf e.Control Is System.Windows.Forms.DataGridViewComboBoxEditingControl Then

            If IndexColunaQueVaiSerEditada = 3 Then

                For Each M As DataGridViewRow In Me.tabelaDataGridView.Rows

                    If M.IsNewRow Then Exit For

                    If M.Cells(3).Value = "É Chave!" Then

                        Dim L As New List(Of String)

                        'Só deixo que estes sejam mostrados, deves adicionar todos menos o "É Chave!"

                        L.Add("Não Chave")

                        Dim C As System.Windows.Forms.ComboBox = CType(e.Control, System.Windows.Forms.ComboBox)

                        C.DataSource = L

                        Exit For

                    End If

                Next

            ElseIf IndexColunaQueVaiSerEditada = 1 Then

                'Faz o que tem a fazer para a coluna 1

            Else

                '...

            End If

        End If

    End Sub 

O que te parece? Os outros If´s nada têm pois só preciso de alterar a coluna 3. Será que poderias explicar porquê agora funciona e antes não. Deve-se ao Private Sub CellBeginEdit? Obrigado mais uma vez.

  • 2 weeks later...
Posted

Viva,

Estive a fazer mais testes com este código e não estou a conseguir validar o que pretendo. Gostaria de fazer o design de uma tabela em tudo (ou quase tudo) igual ao do SQL Server.

Eu pretendo que quando o utilizador seleciona "É Chave!"  numa qualquer linha, ou seja, campo M.Cells(3).Value = "É Chave!" seja obrigatório que o os campos M.Cells(2).Value = False e M.Cells(1).Value = "int" na mesma linha.

A partir do momento que exista já uma linha com o campo M.Cells(3).Value = "É Chave!" não poderá haver outra célula desta coluna que tenha M.Cells(3).Value = "É Chave!", uma vez que uma tabela só poderá ter um campo chave.

A partir daqui, ou seja, havendo um campo que já seja chave a lista de valores que aparece para este campo é apenas "Não Chave".

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.