arrelialp Posted April 12, 2012 at 03:41 PM Report #448790 Posted April 12, 2012 at 03:41 PM 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 🙂
Caça Posted April 12, 2012 at 03:48 PM Report #448791 Posted April 12, 2012 at 03:48 PM Queres limitar as escolhas possíveis na combobox para uma determinada linha? Pedro Martins Não respondo a duvidas por PM
arrelialp Posted April 12, 2012 at 04:18 PM Author Report #448799 Posted April 12, 2012 at 04:18 PM 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?
Caça Posted April 12, 2012 at 04:43 PM Report #448805 Posted April 12, 2012 at 04:43 PM 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
arrelialp Posted April 12, 2012 at 05:16 PM Author Report #448810 Posted April 12, 2012 at 05:16 PM 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?
Caça Posted April 12, 2012 at 05:54 PM Report #448819 Posted April 12, 2012 at 05:54 PM 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
arrelialp Posted April 13, 2012 at 11:06 AM Author Report #448925 Posted April 13, 2012 at 11:06 AM Hummm, está-me a dar o seguinte erro: Variable 'L' hides a variable in an enclosing block.
José Lopes Posted April 13, 2012 at 12:28 PM Report #448931 Posted April 13, 2012 at 12:28 PM Estás a usar duas vezes a variável L... For Each L As DataGridViewRow In Me.tabelaDataGridView.Rows Dim L As New List(Of String) e que tal declarar variáveis mais legíveis... tens aqui um artigo sobre o assunto: http://en.wikipedia.org/wiki/Naming_convention_(programming) Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!
arrelialp Posted April 13, 2012 at 01:18 PM Author Report #448941 Posted April 13, 2012 at 01:18 PM Tens razão 🙂 Muito obrigado ao Caça e ao José Lopes pela ajuda 😄
Caça Posted April 13, 2012 at 01:56 PM Report #448947 Posted April 13, 2012 at 01:56 PM Estás a usar duas vezes a variável L... For Each L As DataGridViewRow In Me.tabelaDataGridView.Rows Dim L As New List(Of String) e que tal declarar variáveis mais legíveis... tens aqui um artigo sobre o assunto: http://en.wikipedia.org/wiki/Naming_convention_(programming) Foi feito de cabeça, não tinha exprimentado.. Pedro Martins Não respondo a duvidas por PM
José Lopes Posted April 13, 2012 at 02:06 PM Report #448951 Posted April 13, 2012 at 02:06 PM Não foi no teu código...estava a responder ao último post...nem a dica era obviamente para ti ;-) Quando te pedirem peixe.... ensina-os a Pescar!!Hum..lálálálá!!
arrelialp Posted April 21, 2012 at 03:22 PM Author Report #450402 Posted April 21, 2012 at 03:22 PM 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?
Caça Posted April 22, 2012 at 02:23 PM Report #450524 Posted April 22, 2012 at 02:23 PM Tens de fazer uma verificação. Pedro Martins Não respondo a duvidas por PM
arrelialp Posted April 22, 2012 at 04:11 PM Author Report #450534 Posted April 22, 2012 at 04:11 PM Como? Podes-me indicar. Obrigado desde já.
Caça Posted April 22, 2012 at 10:23 PM Report #450616 Posted April 22, 2012 at 10:23 PM Verifica se o índex da coluna selecionada é igual ao índex da coluna que queres controlar. Pedro Martins Não respondo a duvidas por PM
arrelialp Posted April 23, 2012 at 02:39 PM Author Report #450742 Posted April 23, 2012 at 02:39 PM Pedro, desculpa lá mas onde e como faço isso?
Caça Posted April 23, 2012 at 03:12 PM Report #450759 Posted April 23, 2012 at 03:12 PM 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
arrelialp Posted April 24, 2012 at 02:35 PM Author Report #451119 Posted April 24, 2012 at 02:35 PM 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.
Caça Posted April 24, 2012 at 03:03 PM Report #451125 Posted April 24, 2012 at 03:03 PM Sim. Pedro Martins Não respondo a duvidas por PM
arrelialp Posted May 7, 2012 at 05:51 PM Author Report #453613 Posted May 7, 2012 at 05:51 PM 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".
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now