共用方式為


瀏覽資料 (Windows Forms .NET)

若要瀏覽資料來源中的記錄,最簡單的方式是將 BindingSource (部分機器翻譯) 元件繫結至資料來源,然後將控制項繫結至 BindingSource。 接著,您可以使用 BindingSource 的內建瀏覽方法,例如 MoveNext (部分機器翻譯)、MoveLast (英文)、MovePrevious (英文) 和 MoveFirst (部分機器翻譯)。 使用這些方法會適當地調整 BindingSourcePosition (部分機器翻譯) 和 Current (部分機器翻譯) 屬性。 您也可以藉由設定 Position 屬性,來尋找記錄並將其設定為目前記錄。

遞增資料來源中的記錄位置

將所繫結資料之 BindingSource (部分機器翻譯) 的 Position (部分機器翻譯) 屬性設定為記錄位置,以移至所需的記錄位置。 下列範例說明如何使用 BindingSourceMoveNext (部分機器翻譯) 方法,以在您選取 nextButton 時遞增 Position 屬性。 BindingSource 會與資料集 NorthwindCustomers 資料表相關聯。

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

注意

Position (部分機器翻譯) 屬性設定為超過第一筆或最後一筆記錄的值並不會導致錯誤,因為 Windows Forms 不會將位置設定為超過清單界限的值。 如果了解是否已超過第一筆或最後一筆記錄很重要,請納入用於測試是否會過出資料元素計數的邏輯。

檢查您是否已超過第一筆或最後一筆記錄

建立 PositionChanged 事件的事件處理常式。 在處理常式中,您可以測試建議的位置值是否已超過實際的資料元素計數。

下列範例會說明如何測試您是否已到達最後一個資料元素。 在此範例中,如果您位於最後一個元素,表單上的 [下一頁] 按鈕會停用。

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

注意

請注意,如果您變更要在程式碼中瀏覽的清單,則應該重新啟用 [下一頁] 按鈕,讓使用者可以瀏覽新清單的整個長度。 此外,也請注意,您正在使用的特定 BindingSource (部分機器翻譯) 的上述 PositionChanged (部分機器翻譯) 事件需要與其事件處理方法相關聯。

尋找記錄並將其設定為目前項目

尋找您想要設定為目前項目的記錄。 如果您的資料來源實作 IBindingList (部分機器翻譯),請使用 BindingSource (部分機器翻譯) 的 Find (部分機器翻譯) 方法,如範例所示。 實作 IBindingList 的一些資料來源範例為 BindingList<T> (部分機器翻譯) 和 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

確認子資料表中選取的資料列保持在正確位置

當您使用 Windows Forms 中的資料繫結時,您會在父代/子系或主要/詳細資料檢視中顯示資料。 這是來自相同來源的資料顯示在兩個控制項中的資料繫結案例。 在一個控制項中變更選取範圍會造成第二個控制項中顯示的資料也變更。 比方說,第一個控制項可能包含客戶清單,而第二個控制項包含與第一個控制項中所選取客戶相關的訂單清單。

當您在父代/子系檢視中顯示資料時,您可能必須採取額外的步驟,以確定子資料表中目前選取的資料列不會重設為資料表的第一個資料列。 若要這樣做,您必須快取子系資料表位置並在父資料表變更之後重設它。 重設子資料表通常會發生在父資料表的資料列欄位第一次變更時。

快取目前的子資料表位置

  1. 宣告整數變數來儲存子資料表位置,並宣告布林值變數來儲存是否要快取子資料表位置。

    private int cachedPosition = -1;
    private bool cacheChildPosition = true;
    
    Private cachedPosition As Integer = -1
    Private cacheChildPosition As Boolean = True
    
  2. 處理繫結 CurrencyManagerListChanged 事件,並檢查 ResetListChangedType

  3. 檢查 CurrencyManager 的目前位置。 如果大於清單中的第一個項目 (通常為 0),將它儲存到變數。

    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. 處理父貨幣管理員的父清單 CurrentChanged 事件。 在處理常式中,設定布林值以表示不是快取案例。 如果發生 CurrentChanged,父系的變更是清單位置變更,而不是項目值變更。

    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
    

重設子資料表位置

  1. 處理子資料表繫結的 CurrencyManager (部分機器翻譯) 的 PositionChanged (部分機器翻譯) 事件。

  2. 將子資料表位置重設為儲存在先前程序中的快取位置。

    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
    

若要測試程式碼範例,請執行下列步驟:

  1. 執行範例。

  2. 確定已選取 [快取和重設位置] 核取方塊。

  3. 選取 [清除父欄位] 按鈕,使父資料表的欄位變更。 請注意,子資料表中的選取資料列不會變更。

  4. 關閉並重新執行此範例。 您需要重新執行此範例,因為重設行為只會在父資料列中的第一次變更時發生。

  5. 清除 [快取和重設位置] 核取方塊。

  6. 選取 [清除父欄位] 按鈕。 請注意,子資料表中的選取資料列會變更為第一個資料列。

另請參閱