Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La manera más fácil de navegar por los registros de un origen de datos es enlazar un BindingSource componente al origen de datos y, a continuación, enlazar controles a BindingSource
. A continuación, puede usar el método de navegación integrado de BindingSource
, como MoveNext, MoveLast, MovePreviousy MoveFirst. Usar estos métodos ajustará las propiedades Position y Current del BindingSource
adecuadamente. También puede encontrar un registro y establecerlo como registro actual estableciendo la Position
propiedad .
Para incrementar la posición del registro en un origen de datos
Establezca la propiedad de Position para sus datos enlazados en la posición del registro y diríjase a la posición de registro requerida. En el siguiente ejemplo se ilustra cómo usar el método MoveNext de BindingSource
para incrementar la propiedad Position
cuando seleccionas el nextButton
.
BindingSource
está asociado a la Customers
tabla de un conjunto de datos Northwind
.
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
Nota:
Establecer la Position propiedad en un valor más allá del primer o último registro no produce un error, ya que Windows Forms no establecerá la posición en un valor fuera de los límites de la lista. Si es importante saber si ha excedido el primer o último registro, incluya lógica para verificar si se excederá el recuento de elementos de datos.
Para comprobar si ha superado el primer o el último registro
Cree un controlador de eventos para el PositionChanged evento. En el controlador, puede probar si el valor de posición propuesto ha superado el recuento real de elementos de datos.
En el ejemplo siguiente se muestra cómo puede probar si ha alcanzado el último elemento de datos. En el ejemplo, si está en el último elemento, el botón Siguiente del formulario está deshabilitado.
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
Nota:
Tenga en cuenta que, si cambia la lista que está navegando en el código, debe volver a habilitar el botón Siguiente para que los usuarios puedan examinar toda la nueva lista. Además, tenga en cuenta que el evento anterior PositionChanged para el específico BindingSource con el que está trabajando debe asociarse con su método de control de eventos.
Para buscar un registro y establecerlo como elemento actual
Busque el registro que desea establecer como elemento actual. Utiliza el método Find del BindingSource según se muestra en el ejemplo, si tu origen de datos implementa IBindingList. Algunos ejemplos de orígenes de datos que implementan IBindingList
son BindingList<T> y 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 asegurarse de que la fila seleccionada de una tabla secundaria permanezca en la posición correcta
Al trabajar con el enlace de datos en Windows Forms, se mostrarán los datos en una vista de padre/hijo o maestro/detalle. Es un escenario de enlace de datos en el que los datos del mismo origen se muestran en dos controles. Cambiar la selección en un control hace que los datos que se muestran en el segundo control cambien. Por ejemplo, el primer control puede contener una lista de clientes y la segunda una lista de pedidos relacionados con el cliente seleccionado en el primer control.
Al mostrar datos en una vista primaria o secundaria, es posible que tenga que realizar pasos adicionales para asegurarse de que la fila seleccionada actualmente en la tabla secundaria no se restablezca a la primera fila de la tabla. Para ello, tendrá que almacenar en caché la ubicación de la tabla secundaria y restablecerla después de que cambie la tabla primaria. Normalmente, el restablecimiento de la tabla secundaria se produce la primera vez que cambia un campo de una fila de la tabla primaria.
Almacenar en caché la posición de la tabla secundaria actual
Declare una variable entera para almacenar la posición de la tabla secundaria y una variable booleana para indicar si la posición de la tabla secundaria se debe guardar en caché.
private int cachedPosition = -1; private bool cacheChildPosition = true;
Private cachedPosition As Integer = -1 Private cacheChildPosition As Boolean = True
Gestione el ListChanged evento del enlace de CurrencyManager y compruebe si hay un ListChangedType de Reset.
Compruebe la posición actual del CurrencyManager. Si es mayor que la primera entrada de la lista (normalmente 0), guárdela en una variable.
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
Gestione el evento CurrentChanged de la lista principal para el administrador de moneda principal. En el controlador, establezca el valor booleano para indicar que no es un escenario de almacenamiento en caché. Si
CurrentChanged
ocurre, el cambio al elemento primario es un cambio de posición de lista y no un cambio de valor de elemento.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 restablecer la posición de la tabla hija
Controle el evento PositionChanged del enlace de la tabla secundaria CurrencyManager.
Restablezca la posición de la tabla hija a la posición almacenada en caché guardada en el procedimiento 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 probar el ejemplo de código, realice los pasos siguientes:
Ejecute el ejemplo.
Asegúrese de que la casilla Caché y restablecer la posición está activada.
Seleccione el botón Borrar campo primario para provocar un cambio en un campo de la tabla primaria. Observe que la fila seleccionada en la tabla secundaria no cambia.
Cierre y vuelva a ejecutar el ejemplo. Debe volver a ejecutarlo porque el comportamiento de reinicio solo se produce en el primer cambio en la fila principal.
Desactive la casilla Caché y restablecer la posición .
Seleccione el botón Borrar campo primario . Observe que la fila seleccionada de la tabla secundaria cambia a la primera fila.
Consulte también
.NET Desktop feedback