首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Visual C# 實作資料庫記錄瀏覽器:DataBinding 與 BindingManagerBase 完整教學

     編輯:關於C#

前言:從 Delphi/VB 到 C# 的資料導航遷移

在 Delphi 或 Visual Basic 時代,「資料導航器」是內建元件,拖拉即可實現資料庫記錄的首筆、末筆、上一筆、下一筆瀏覽。進入 Visual C# 後,雖然沒有同名元件,但透過 ADO.NET 的 DataSet、DataAdapter 搭配 Windows Forms 的 資料繫結 機制,配合 BindingManagerBase(具體為 CurrencyManager)控制記錄指標,同樣能輕鬆打造功能完整的記錄瀏覽器。本文以 Access 資料庫為例,完整示範從連線、繫結到導航邏輯的實作全過程。

開發環境與先決條件

  • 作業系統:Windows 2000 Server(教學年代背景,現代環境同樣適用)
  • 資料庫元件:Microsoft Access Data Component 2.6 (MDAC 2.6) 或更新版本
  • 開發工具:Visual Studio .NET (C#)
  • 範例資料庫:sample.mdb 內含 books 資料表(欄位:bookid、booktitle、bookauthor、bookprice、bookstock)

核心技術解析

關鍵一:TextBox 動態顯示資料欄位 — DataBindings.Add

若直接指派 textBox.Text = row["field"],游標移動時介面不會自動更新。正確做法是利用控制項的 DataBindings 集合,將控制項屬性(如 Text)繫結至 DataSet 的特定資料表欄位:

// 語法:控制項.DataBindings.Add(控制項屬性, 資料來源, "資料表.欄位")
t_bookid.DataBindings.Add("Text", myDataSet, "books.bookid");
t_booktitle.DataBindings.Add("Text", myDataSet, "books.booktitle");
t_bookauthor.DataBindings.Add("Text", myDataSet, "books.bookauthor");
t_bookprice.DataBindings.Add("Text", myDataSet, "books.bookprice");
t_books.DataBindings.Add("Text", myDataSet, "books.bookstock");

繫結完成後,BindingContext 會自動建立對應的 CurrencyManager 管理該資料來源的當前記錄位置,TextBox 會隨著記錄指標自動刷新顯示值,無需手動寫入迴圈。

關鍵二:掌握記錄指標 — BindingManagerBase (CurrencyManager)

透過表單的 BindingContext[DataSet, "TableName"] 取得 BindingManagerBase 實例(實際為 CurrencyManager),其兩個核心屬性:

  • Position:目前記錄索引(0-based),讀寫皆可,指派新值即移動游標
  • Count:資料集總筆數

四個導航按鈕的邏輯由此直觀實現:

// 首記錄
myBind.Position = 0;

// 尾記錄
myBind.Position = myBind.Count - 1;

// 下一筆
if (myBind.Position == myBind.Count - 1)
    MessageBox.Show("已經是最後一筆記錄!");
else
    myBind.Position += 1;

// 上一筆
if (myBind.Position == 0)
    MessageBox.Show("已經是第一筆記錄!");
else
    myBind.Position -= 1;

完整程式碼架構

1. 表單類別與核心欄位

public class DataView : Form
{
    private DataSet myDataSet;
    private BindingManagerBase myBind;
    // UI 控制項宣告...
    public DataView()
    {
        GetConnected();  // 先連資料庫、填充 DataSet
        InitializeComponent(); // 再初始化 UI 與繫結
    }
    // ...
}

順序關鍵:必須先 GetConnected() 填充 myDataSet,再執行 InitializeComponent() 進行 DataBindings.Add,否則繫結時資料來源為空會拋出例外。

2. 資料庫連線與 DataSet 填充

public void GetConnected()
{
    try
    {
        string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=sample.mdb";
        using (OleDbConnection myConn = new OleDbConnection(strCon))
        {
            string strCom = "SELECT * FROM books";
            myDataSet = new DataSet();
            OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
            myCommand.Fill(myDataSet, "books"); // 關鍵:指定 DataTable 名稱 "books"
            myConn.Close();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("連接錯誤!" + ex.ToString(), "錯誤");
    }
}

3. UI 初始化與繫結建立

在 InitializeComponent 中:

  • 建立 4 個 Button(首記錄、上一條、下一條、尾記錄)並掛接 Click 事件
  • 建立 5 個 Label + 5 個 TextBox 對應欄位
  • 對每個 TextBox 呼叫 DataBindings.Add("Text", myDataSet, "books.欄位名")
  • 最後建立 myBind = this.BindingContext[myDataSet, "books"]; 取得管理器

4. 導航事件處理器

protected void GoFirst(object sender, EventArgs e) { myBind.Position = 0; }
protected void GoPrevious(object sender, EventArgs e) 
{ 
    if (myBind.Position == 0) MessageBox.Show("已經到了第一條記錄!");
    else myBind.Position -= 1; 
}
protected void GoNext(object sender, EventArgs e) 
{ 
    if (myBind.Position == myBind.Count - 1) MessageBox.Show("已經到了最後一條記錄!");
    else myBind.Position += 1; 
}
protected void GoLast(object sender, EventArgs e) { myBind.Position = myBind.Count - 1; }

進階補充:現代化改良建議

總結

C# 雖無現成「資料導航器」元件,但 DataBinding + BindingManagerBase 的組合提供了更靈活、更物件導向的控制方式。掌握「繫結屬性而非指派值」與「操作 Position 而非手動搬移資料」兩大核心觀念,即可輕鬆實現資料庫記錄的流暢瀏覽,並可延伸至主從表、篩選、排序等進階應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
原教學做法現代最佳實踐
OleDbConnection 手動 Open/Close使用 using 區塊確保釋放
硬編碼連線字串存放於 app.config / appsettings.json
DataSet 離線模式小資料量可用;大資料量建議 DataReader + 分頁查詢
WinForms 絕對座標佈局使用 TableLayoutPanel / FlowLayoutPanel 或 WPF/XAML
同步封鎖 UI資料載入改用 async/await 非同步模式