Sdílet prostřednictvím


Procházení dat (model Windows Forms .NET)

Nejjednodušší způsob, jak procházet záznamy ve zdroji dat, je vytvořit vazbu BindingSource komponenty ke zdroji dat a poté vytvořit vazbu ovládacích prvků na BindingSource. Pak můžete použít předdefinovaný způsob navigace BindingSource, například MoveNext, MoveLast, MovePreviousa MoveFirst. Pomocí těchto metod upravíte Position vlastnosti a Current vlastnosti BindingSource odpovídajícím způsobem. Záznam můžete také najít a nastavit jako aktuální záznam nastavením Position vlastnosti.

Zvýšení pozice záznamu ve zdroji dat

Position Nastavte vlastnost BindingSource pro svázaná data na pozici záznamu tak, aby přešla na požadovanou pozici záznamu. Následující příklad znázorňuje použití MoveNext metody BindingSource zvýšení Position vlastnosti při výběru nextButton. Je BindingSource přidružen k Customers tabulce datové sady 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

Poznámka:

Position Nastavení vlastnosti na hodnotu nad rámec prvního nebo posledního záznamu nemá za následek chybu, protože model Windows Forms nenastaví pozici na hodnotu mimo hranice seznamu. Pokud je důležité vědět, jestli jste prošli prvním nebo posledním záznamem, zahrňte logiku, která otestuje, jestli překročíte počet datových prvků.

Kontrola, jestli jste překročili první nebo poslední záznam

Vytvořte obslužnou rutinu PositionChanged události pro událost. V obslužné rutině můžete otestovat, zda navrhovaná hodnota pozice překročila skutečný počet datových prvků.

Následující příklad ukazuje, jak můžete otestovat, jestli jste dosáhli posledního datového prvku. V příkladu, pokud jste na posledním prvku, tlačítko Další ve formuláři je zakázáno.

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

Poznámka:

Mějte na paměti, že pokud změníte seznam, který procházíte v kódu, měli byste znovu povolit tlačítko Další , aby uživatelé mohli procházet celou délku nového seznamu. Kromě toho mějte na paměti, že výše uvedená PositionChanged událost pro konkrétní BindingSource , se kterou pracujete, musí být přidružena k metodě zpracování událostí.

Vyhledání záznamu a jeho nastavení jako aktuální položky

Najděte záznam, který chcete nastavit jako aktuální položku. Find Použijte metodu BindingSource metody, jak je znázorněno v příkladu, pokud váš zdroj dat implementuje IBindingList. Příklady zdrojů dat, které implementují IBindingList , jsou BindingList<T> a 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

Chcete-li zajistit, aby vybraný řádek v podřízené tabulce zůstal na správné pozici

Když pracujete s datovou vazbou v model Windows Forms, zobrazí se data v zobrazení nadřazenosti, podřízenosti nebo předlohy nebo podrobností. Jedná se o scénář datové vazby, ve kterém se data ze stejného zdroje zobrazují ve dvou ovládacích prvcích. Změna výběru v jednom ovládacím prvku způsobí, že se změní data zobrazená ve druhém ovládacím prvku. První ovládací prvek může například obsahovat seznam zákazníků a druhý seznam objednávek souvisejících s vybraným zákazníkem v prvním ovládacím prvku.

Když zobrazíte data v zobrazení nadřazeného nebo podřízeného objektu, budete možná muset provést další kroky, abyste zajistili, že aktuálně vybraný řádek v podřízené tabulce nebude resetovat na první řádek tabulky. Abyste to mohli udělat, budete muset umístění podřízené tabulky uložit do mezipaměti a po změně nadřazené tabulky ji resetovat. K resetování podřízené tabulky obvykle dochází při prvním změně pole v řádku nadřazené tabulky.

Uložení aktuální podřízené tabulky do mezipaměti

  1. Deklarujte celočíselnou proměnnou, která uloží pozici podřízené tabulky a logickou proměnnou, do které se uloží umístění podřízené tabulky do mezipaměti.

    private int cachedPosition = -1;
    private bool cacheChildPosition = true;
    
    Private cachedPosition As Integer = -1
    Private cacheChildPosition As Boolean = True
    
  2. Zpracujte ListChanged událost vazby CurrencyManager a zkontrolujte ListChangedTypeReset

  3. Zkontrolujte aktuální pozici objektu CurrencyManager. Pokud je větší než první položka v seznamu (obvykle 0), uložte ji do proměnné.

    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
    
  4. Zpracujte událost nadřazeného seznamu CurrentChanged pro nadřazeného správce měn. V obslužné rutině nastavte logickou hodnotu tak, aby označí, že se nejedná o scénář ukládání do mezipaměti. Pokud k tomu CurrentChanged dojde, změna nadřazeného objektu je změna pozice seznamu, nikoli změna hodnoty položky.

    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
    

Resetování pozice podřízené tabulky

  1. PositionChanged Zpracování události pro vazby CurrencyManagerpodřízené tabulky .

  2. Obnovte pozici podřízené tabulky na pozici uloženou v mezipaměti uloženou v předchozím postupu.

    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
    

Pokud chcete otestovat příklad kódu, proveďte následující kroky:

  1. Spusťte příklad.

  2. Ujistěte se, že je zaškrtnuté políčko Umístění mezipaměti a resetování .

  3. Výběrem tlačítka Vymazat nadřazené pole způsobíte změnu v poli nadřazené tabulky. Všimněte si, že vybraný řádek v podřízené tabulce se nezmění.

  4. Zavřete příklad a spusťte ho znovu. Musíte ho spustit znovu, protože chování resetování probíhá pouze při první změně nadřazeného řádku.

  5. Zrušte zaškrtnutí políčka Uložit do mezipaměti a obnovit umístění.

  6. Vyberte tlačítko Vymazat nadřazené pole. Všimněte si, že vybraný řádek v podřízené tabulce se změní na první řádek.

Viz také