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
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
Zpracujte ListChanged událost vazby CurrencyManager a zkontrolujte ListChangedType Reset
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
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
PositionChanged Zpracování události pro vazby CurrencyManagerpodřízené tabulky .
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:
Spusťte příklad.
Ujistěte se, že je zaškrtnuté políčko Umístění mezipaměti a resetování .
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í.
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.
Zrušte zaškrtnutí políčka Uložit do mezipaměti a obnovit umístění.
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é
.NET Desktop feedback