Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az adatforrás rekordjai között a legegyszerűbben úgy navigálhat, ha egy BindingSource összetevőt az adatforráshoz köt, majd a vezérlőket a BindingSource
köti. Ezután használhatja a BindingSource
beépített navigációs módszerét , például MoveNext, MoveLast, MovePreviousés MoveFirst. Ezek a módszerek megfelelően módosítják a PositionCurrent és BindingSource
tulajdonságait. A rekordot a Position
tulajdonság beállításával is megkeresheti, és beállíthatja aktuális rekordként.
A rekord pozíciójának növelése adatforrásban
Állítsa be a kötött adatokhoz tartozó PositionBindingSource tulajdonságát a rekordpozícióra, hogy a kívánt rekordhoz jusson. Az alábbi példa a MoveNextBindingSource
metódusának használatával mutatja be a Position
tulajdonság növelését a nextButton
kiválasztásakor. A BindingSource
egy adathalmaz Customers
Northwind
táblázatához van társítva.
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
Megjegyzés:
Ha a Position tulajdonságot az első vagy az utolsó rekordon kívüli értékre állítja, az nem eredményez hibát, mivel a Windows Forms nem állítja be a pozíciót a lista határain kívül eső értékre. Ha fontos tudni, hogy túllépte-e az első vagy az utolsó rekordot, tartalmazhat logikát annak tesztelésére, hogy meghaladja-e az adatelemek számát.
Annak ellenőrzése, hogy túllépte-e az első vagy az utolsó rekordot
Hozzon létre egy eseménykezelőt a PositionChanged eseményhez. A kezelőben tesztelheti, hogy a javasolt pozícióérték túllépte-e az adatelemek tényleges számát.
Az alábbi példa bemutatja, hogyan tesztelheti, hogy elérte-e az utolsó adatelemet. A példában, ha az utolsó elemnél van, az űrlap Következő gombja le van tiltva.
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
Megjegyzés:
Vegye figyelembe, hogy ha módosítja a kódban navigáló listát, újra engedélyeznie kell a Tovább gombot, hogy a felhasználók az új lista teljes hosszában böngészhessenek. Vegye figyelembe továbbá, hogy a fenti PositionChanged eseményt az adott BindingSource, amellyel dolgozik, az eseménykezelési módszerhez kell társítani.
Rekord megkeresése és beállítása aktuális elemként
Keresse meg az aktuális elemként beállítani kívánt rekordot. Használja a Find metódusát a BindingSource példában látható módon, ha az adatforrás implementálja a IBindingList. Néhány példa a IBindingList
implementálására szolgáló adatforrásokra BindingList<T> és 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
Annak biztosítása, hogy a gyermektábla kijelölt sora a megfelelő helyen maradjon
Amikor a Windows Formsban adatkötéssel dolgozik, az adatokat szülő-/gyermek- vagy mester/részlet nézetben jeleníti meg. Ez egy adatkötési forgatókönyv, amelyben az azonos forrásból származó adatok két vezérlőben jelennek meg. Ha egy vezérlőben módosítja a kijelölést, a második vezérlőben megjelenő adatok megváltoznak. Előfordulhat például, hogy az első vezérlő tartalmazza az ügyfelek listáját, a második pedig a kiválasztott ügyfélhez kapcsolódó rendelések listáját az első vezérlőben.
Ha szülő-gyermek nézetben jelenít meg adatokat, előfordulhat, hogy további lépéseket kell tennie annak érdekében, hogy a gyermektábla jelenleg kijelölt sora ne legyen visszaállítva a tábla első sorára. Ehhez gyorsítótárba kell helyeznie a gyermektábla pozícióját, és alaphelyzetbe kell állítania a szülőtábla módosítása után. A gyermektábla alaphelyzetbe állítása általában akkor fordul elő, amikor a szülőtábla sorában először változik egy mező.
A gyermektábla aktuális pozíciójának gyorsítótárazása
Deklaráljon egy egész típusú változót a gyermektábla pozíciójának tárolására, és egy logikai változót a gyermektábla pozíciója gyorsítótárazásának kezelésére.
private int cachedPosition = -1; private bool cacheChildPosition = true;
Private cachedPosition As Integer = -1 Private cacheChildPosition As Boolean = True
Kezelje a kötés ListChanged-hez tartozó CurrencyManager-eseményt, és ellenőrizze a ListChangedType-ban a Reset jelenlétét.
Ellenőrizze a CurrencyManageraktuális pozícióját. Ha nagyobb, mint a lista első bejegyzése (általában 0), mentse egy változóba.
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
Kezelje a szülőlista CurrentChanged eseményét a szülő pénznemkezelő számára. A kezelőben állítsa be a logikai értéket úgy, hogy az jelezze: nem egy gyorsítótárazási helyzetről van szó. Ha bekövetkezik a
CurrentChanged
, a szülő listapozíciójának változása történik, nem pedig az elemérték változása.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
A gyermektábla pozíciójának alaphelyzetbe állítása
Kezelje a PositionChanged eseményt a gyermektábla-kötés CurrencyManagerszámára.
Állítsa vissza a gyermektábla pozícióját az előző eljárásban mentett gyorsítótárban lévő pozícióra.
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
A példakód teszteléséhez hajtsa végre a következő lépéseket:
Futtasd a példát.
Győződjön meg arról, hogy a gyorsítótár és a pozíció visszaállítása opció be van jelölve az jelölőnégyzetnél.
Válassza a Szülő mező törlése gombot a szülőtábla mezőinek módosításához. Figyelje meg, hogy a gyermektábla kijelölt sora nem változik.
Zárja be és futtassa újra a példát. Újra kell futtatnia, mert az alaphelyzetbe állítási viselkedés csak a szülősor első módosításakor következik be.
Törölje a Gyorsítótárat, és állítsa vissza a jelölőnégyzet pozícióját.
Válassza a Szülőmező törlése gombot. Figyelje meg, hogy a gyermektábla kijelölt sora az első sorra változik.
Lásd még
.NET Desktop feedback