Navegar em dados (Windows Forms .NET)
A maneira mais fácil de navegar pelos registros em uma fonte de dados é vincular um BindingSource componente à fonte de dados e, em seguida, vincular controles ao BindingSource
. Em seguida, você pode usar o BindingSource
método de navegação interno do , como MoveNext, , MoveLastMovePreviouse MoveFirst. O uso desses métodos ajustará as Position propriedades e Current o BindingSource
apropriado. Você também pode localizar um registro e defini-lo como o registro atual definindo a Position
propriedade.
Para incrementar a posição do registro em uma fonte de dados
Defina a propriedade do para seus dados vinculados à posição do registro para ir para a Position posição de BindingSource registro necessária. O exemplo a seguir ilustra o uso do método do para incrementar a Position
propriedade quando você seleciona o MoveNextnextButton
.BindingSource
O BindingSource
está associado à Customers
tabela de um conjunto Northwind
de dados .
private void nextButton_Click(object sender, System.EventArgs e)
{
this.customersBindingSource.MoveNext();
}
Private Sub nextButton_Click(ByVal sender As Object,
ByVal e As System.EventArgs) Handles nextButton.Click
Me.customersBindingSource.MoveNext()
End Sub
Observação
Definir a propriedade como um valor além do primeiro ou do último registro não resulta em um erro, pois o Windows Forms não definirá a Position posição como um valor fora dos limites da lista. Se for importante saber se você passou do primeiro ou do último registro, inclua lógica para testar se excederá a contagem de elementos de dados.
Para verificar se você excedeu o primeiro ou o último registro
Crie um manipulador de eventos para o evento PositionChanged. No manipulador, é possível testar se o valor da posição proposta excedeu a contagem de elementos de dados real.
O exemplo a seguir ilustra como você pode testar se atingiu o último elemento de dados. No exemplo, se você estiver no último elemento, o botão Próximo do formulário estará desabilitado.
void customersBindingSource_PositionChanged(object sender, EventArgs e)
{
if (customersBindingSource.Position == customersBindingSource.Count - 1)
nextButton.Enabled = false;
else
nextButton.Enabled = true;
}
Sub customersBindingSource_PositionChanged(ByVal sender As Object,
ByVal e As EventArgs)
If customersBindingSource.Position =
customersBindingSource.Count - 1 Then
nextButton.Enabled = False
Else
nextButton.Enabled = True
End If
End Sub
Observação
Lembre-se de que, se você alterar a lista que está navegando no código, deverá reativar o botão Avançar para que os usuários possam navegar por toda a extensão da nova lista. Além disso, esteja ciente de que o evento acima PositionChanged para o específico BindingSource com o qual você está trabalhando precisa ser associado ao seu método de manipulação de eventos.
Para localizar um registro e defini-lo como o item atual
Localize o registro que deseja definir como o item atual. Use o Find método do como mostrado no exemplo, se sua fonte de BindingSource dados implementa IBindingList. Alguns exemplos de fontes de dados que implementam IBindingList
são BindingList<T> e DataView.
void findButton_Click(object sender, EventArgs e)
{
int foundIndex = customersBindingSource.Find("CustomerID", "ANTON");
customersBindingSource.Position = foundIndex;
}
Sub findButton_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles findButton.Click
Dim foundIndex As Integer = customersBindingSource.Find("CustomerID",
"ANTON")
customersBindingSource.Position = foundIndex
End Sub
Para garantir que a linha selecionada em uma tabela filho permaneça na posição correta
Ao trabalhar com vinculação de dados no Windows Forms, você exibirá dados em um modo de exibição pai/filho ou mestre/detalhe. É um cenário de vinculação de dados em que os dados da mesma fonte são exibidos em dois controles. Alterar a seleção em um controle faz com que os dados exibidos no segundo controle mudem. Por exemplo, o primeiro controle pode conter uma lista de clientes e o segundo, uma lista de pedidos relacionada ao cliente selecionado no primeiro controle.
Ao exibir dados em um modo de exibição pai/filho, talvez seja necessário executar etapas extras para garantir que a linha atualmente selecionada na tabela filho não seja redefinida para a primeira linha da tabela. Para fazer isso, você terá que armazenar em cache a posição da tabela filho e redefini-la depois que a tabela pai for alterada. Normalmente, a redefinição da tabela filho ocorre na primeira vez que um campo em uma linha da tabela pai é alterado.
Para armazenar em cache a posição atual da tabela filho
Declare uma variável inteira para armazenar a posição da tabela filho e uma variável booleana para armazenar se a posição da tabela filho deve ser armazenada em cache.
private int cachedPosition = -1; private bool cacheChildPosition = true;
Private cachedPosition As Integer = -1 Private cacheChildPosition As Boolean = True
Manipule o ListChanged evento para as ligações CurrencyManager e verifique se há um ListChangedType de Reset.
Verifique a posição atual do CurrencyManager. Se for maior que a primeira entrada da lista (normalmente 0), salve-a em uma variável.
void relatedCM_ListChanged(object sender, ListChangedEventArgs e) { // Check to see if this is a caching situation. if (cacheChildPosition && cachePositionCheckBox.Checked) { // If so, check to see if it is a reset situation, and the current // position is greater than zero. CurrencyManager relatedCM = sender as CurrencyManager; if (e.ListChangedType == ListChangedType.Reset && relatedCM.Position > 0) // If so, cache the position of the child table. cachedPosition = relatedCM.Position; } }
Private Sub relatedCM_ListChanged(ByVal sender As Object, ByVal e As ListChangedEventArgs) ' Check to see if this is a caching situation. If cacheChildPosition AndAlso cachePositionCheckBox.Checked Then ' If so, check to see if it is a reset situation, and the current ' position is greater than zero. Dim relatedCM As CurrencyManager = sender If e.ListChangedType = ListChangedType.Reset _ AndAlso relatedCM.Position > 0 Then ' If so, cache the position of the child table. cachedPosition = relatedCM.Position End If End If End Sub
Manipule o evento da lista pai para o gerenciador de CurrentChanged moedas pai. No manipulador, defina o valor booleano para indicar que não é um cenário de cache. Se ocorrer
CurrentChanged
, a alteração no pai será uma alteração de posição de lista e não uma alteração de valor de item.void bindingSource1_CurrentChanged(object sender, EventArgs e) { // If the CurrentChanged event occurs, this is not a caching // situation. cacheChildPosition = false; }
' Handle the current changed event. This event occurs when ' the current item is changed, but not when a field of the current ' item is changed. Private Sub bindingSource1_CurrentChanged(ByVal sender As Object, ByVal e As EventArgs) Handles bindingSource1.CurrentChanged ' If the CurrentChanged event occurs, this is not a caching ' situation. cacheChildPosition = False End Sub
Para redefinir a posição da tabela filho
Manipule o PositionChanged evento para a associação de CurrencyManagertabela filho .
Redefina a posição da tabela filho para a posição em cache salva no procedimento anterior.
void relatedCM_PositionChanged(object sender, EventArgs e) { // Check to see if this is a caching situation. if (cacheChildPosition && cachePositionCheckBox.Checked) { CurrencyManager relatedCM = sender as CurrencyManager; // If so, check to see if the current position is // not equal to the cached position and the cached // position is not out of bounds. if (relatedCM.Position != cachedPosition && cachedPosition > 0 && cachedPosition < relatedCM.Count) { relatedCM.Position = cachedPosition; cachedPosition = -1; } } }
Private Sub relatedCM_PositionChanged(ByVal sender As Object, ByVal e As EventArgs) ' Check to see if this is a caching situation. If cacheChildPosition AndAlso cachePositionCheckBox.Checked Then Dim relatedCM As CurrencyManager = sender ' If so, check to see if the current position is ' not equal to the cached position and the cached ' position is not out of bounds. If relatedCM.Position <> cachedPosition AndAlso cachedPosition > 0 AndAlso cachedPosition < relatedCM.Count Then relatedCM.Position = cachedPosition cachedPosition = -1 End If End If End Sub
Para testar o exemplo de código, execute as etapas a seguir:
Execute o exemplo.
Verifique se a caixa de seleção Cache e redefinir posição está marcada.
Selecione o botão Limpar campo pai para causar uma alteração em um campo da tabela pai. Observe que a linha selecionada na tabela filho não é alterada.
Feche e execute novamente o exemplo. Você precisa executá-lo novamente porque o comportamento de redefinição ocorre somente na primeira alteração na linha pai.
Desmarque a caixa de seleção Cache e redefinir posição .
Selecione o botão Limpar campo pai. Observe que a linha selecionada na tabela filho muda para a primeira linha.
Confira também
.NET Desktop feedback
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de