Megosztás a következőn keresztül:


Navigálás az adatok között

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 BindingSourceköti. Ezután használhatja a BindingSourcebeé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 nextButtonkiválasztásakor. A BindingSource egy adathalmaz CustomersNorthwind 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

  1. 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
    
  2. Kezelje a kötés ListChanged-hez tartozó CurrencyManager-eseményt, és ellenőrizze a ListChangedType-ban a Reset jelenlétét.

  3. 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
    
  4. 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

  1. Kezelje a PositionChanged eseményt a gyermektábla-kötés CurrencyManagerszámára.

  2. Á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:

  1. Futtasd a példát.

  2. 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.

  3. 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.

  4. 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.

  5. Törölje a Gyorsítótárat, és állítsa vissza a jelölőnégyzet pozícióját.

  6. 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