在企業應用中,頻繁需要「依特徵值(助記碼、編號、名稱)從大量資料中定位目標記錄,再執行後續動作(顯示、修改、同步、複製)」。此模式高度重複,卻因應用場景多變(資料來源、比對方式、速度需求、結果基數、後續處理)難以封裝。
| 維度 | 變化點 |
| 特徵值與搜尋方式 | 助記碼/編號/名稱;左比對/精確/模糊 |
| 關注焦點 | 回應速度(POS 收銀);比對範圍與模式(模糊查詢) |
| 搜尋結果可能性 | 無資料/單筆/多筆(需再選擇) |
| 定位目的 | 指標定位/刷新畫面控制項/同步關聯資料集/複製至另一資料集 |
| 資料來源型別 | 本地 DataTable / DataGridView / 遠端資料庫 |
這些維度非獨立,常以組合形式出現,故不可過度細粒度封裝,需設計一個可擴充的基類,配合「自訂屬性」適應各種組合。
兩層繼承架構設計
- TB_定位存取(基類):核心責任——「依特徵值定位到目標記錄」。提供可覆寫的虛擬方法:
GetSearchExpression():建構邏輯條件(支援多種比對模式)。
OnRecordFound():找到單筆時的預設處理(如設為 Current)。
OnMultipleFound():多筆時彈出選擇視窗。
OnNotFound():無資料時的預設行為(如清空畫面、提示)。
- TB_定位插入(衍生類):繼承定位能力,並在
OnRecordFound後增加「將資料寫入另一資料集/複製到新記錄」等後續處理邏輯。
關鍵設計決策
- 策略模式注入比對邏輯:將「左比對/精確/模糊」封裝為
ISearchStrategy 介面,基類持有策略實例,屬性視窗可切換。
- 非同步回呼支援:定位耗時操作(如遠端查詢)採
BeginSearch/EndSearch 模式,避免 UI 凍結。
- 資料來源抽象:定義
IDataProvider 介面(Find(expression), GetAll()),實作類分別對應 DataTable、DataGridView、Web Service、Entity Framework 等。
- 事件驅動擴充點:公開
BeforeSearch, AfterSearch, RecordSelected 事件,讓使用者控制項訂閱而不需繼承。
使用範例:超市收銀掃碼
// 設定屬性(設計時或執行時)
locator.DataProvider = new BarcodeDbProvider(); // 資料來源
locator.SearchStrategy = new ExactMatchStrategy(); // 精確比對條碼
locator.SearchField = "Barcode"; // 特徵值欄位
locator.OnRecordFound += (s, e) => {
posScreen.AddLineItem(e.FoundRecord); // 直接加入明細
};
locator.OnNotFound += (s, e) => {
MessageBox.Show("查無商品,請人工輸入");
};
// 運行時:掃描槍輸入條碼 → 自動觸發定位 → 觸發對應事件
locator.Locate(scannedBarcode);
總結
「TB_定位存取」將「定位」這一核心動作標準化、組件化,透過策略注入、事件擴充、資料來源抽象,以單一基類支援上述五大維度的任意組合,消除大量重複程式碼,並為「定位插入」等進階功能奠定堅實基礎。
- 上一篇文章: 水晶報表經典技巧三則:分欄、群組格式化與列印方向
- 下一篇文章: 從零打造迷你 HTTP 伺服器(一):協議解析與 HttpStack 設計
Copyright ©
程式碼之家 All Rights Reserved