提供標準化查詢視窗:
| 屬性 | 說明 |
|---|---|
DisplayResultList | 查詢後是否顯示結果清單 |
MultiResult | 是否允許多選回傳 |
QueryBuilder | 查詢條件構造器(供外部取得) |
ResultList | 查詢回傳的實體集合 |
ConfigFileName | 查詢配置檔 (*.pcs) |
<?xml version="1.0" encoding="utf-8"?>
<PropertyColumnConfig>
<Columns> <!-- 結果清單欄位 -->
<Column>
<Key>CardNo</Key> <Text>會員卡號</Text> <Width>120</Width> <Align>Left</Align> <Visible>true</Visible>
</Column>
<Column>
<Key>Name</Key> <Text>姓名</Text> <Width>100</Width> <Align>Left</Align>
</Column>
<Column>
<Key>Score</Key> <Text>積分</Text> <Width>80</Width> <Align>Right</Align> <Type>NumberColumn</Type> <Formater>N0</Formater>
</Column>
<Column>
<Key>Id</Key> <Visible>false</Visible> <!-- 隱藏主鍵 -->
</Column>
</Columns>
<Properties> <!-- 查詢條件 UI -->
<Property>
<PropertyName>Name</PropertyName> <DisplayName>姓名</DisplayName> <Type>String</Type> <ImeMode>On</ImeMode>
</Property>
<Property>
<PropertyName>CardNo</PropertyName> <DisplayName>卡號</DisplayName> <Type>String</Type> <ImeMode>Off</ImeMode>
</Property>
<Property>
<PropertyName>Score</PropertyName> <DisplayName>積分範圍</DisplayName> <Type>DecimalRange</Type>
</Property>
<Property>
<PropertyName>MemberType</PropertyName> <DisplayName>會員類型</DisplayName> <Type>Enum</Type> <EnumType>MyApp.Model.MemberType</EnumType>
</Property>
<Property>
<PropertyName>CreateDate</PropertyName> <DisplayName>建立日期</DisplayName> <Type>DateRange</Type>
</Property>
</Properties>
</PropertyColumnConfig>
public abstract class BaseQueryForm : Form
{
// 1. 建立實體集合型別(供反射/泛型使用)
protected virtual void CreateListInstance(Type entityType) { /* 預設 new List() */ }
// 2. 依 QueryBuilder 執行查詢,回傳 IList
protected abstract IList BuildLists(QueryBuilder qb);
// 3. 格式化單元格顯示值(枚舉轉文字、日期格式等)
protected virtual object FormatValue(object rawValue, string columnKey) => rawValue;
// 4. 取得結果清單顯示欄位陣列(對應 *.cls/*.pcs Columns Key)
protected virtual string[] GetInfoFields() => new string[0];
// 5. 雙擊/確定時回傳選中實體
protected virtual BaseModel GetSelectedInfo(Node selectedNode) => null;
// 6. 驗證查詢條件(可選)
protected virtual bool ValidateQuery() => true;
}
public class MemberQueryForm : BaseQueryForm
{
public MemberQueryForm()
{
ConfigFileName = "MemberQueryForm.pcs";
DisplayResultList = true;
}
protected override void CreateListInstance(Type type)
{
base.CreateListInstance(typeof(MemberList)); // 實作 IList
}
protected override IList BuildLists(QueryBuilder qb)
{
// 加入固定條件:僅查詢正常狀態會員
qb.Append(QueryRelation.And, QueryCompare.Equal, "Status", 1);
var dal = new MemberDAL();
return dal.Search(qb, GetInfoFields()); // 回傳 MemberList
}
protected override object FormatValue(object value, string key)
{
if (key == "MemberType" && value is int enumVal)
return Enum.GetName(typeof(MemberType), enumVal);
return base.FormatValue(value, key);
}
protected override string[] GetInfoFields()
{
return new[] { "Id", "CardNo", "Name", "Score", "MemberType", "Mobile", "CreateDate" };
}
protected override BaseModel GetSelectedInfo(Node node)
{
return node?.Tag as Member; // TreeList 節點 Tag 存實體
}
}
| Type | UI 控制項 | 查詢邏輯 | 適用場景 |
|---|---|---|---|
| String | TextBox | LIKE %value% | 模糊查詢 |
| StringExact | TextBox | = value | 精確代碼 |
| Int/Decimal | NumericUpDown | = value | 精確數值 |
| IntRange/DecimalRange | 兩個 NumericUpDown | BETWEEN min AND max | 範圍查詢 |
| Date/DateTime | DateTimePicker | = value (日期部分) | 單一日期 |
| DateRange | 兩個 DateTimePicker | BETWEEN start AND end | 日期區間 |
| Enum | ComboBox | = value | 狀態/類型 |
| Bool | CheckBox (三態) | = true/false | 是否標記 |
| Reference | Button + 彈出選擇視窗 | = 選中實體.Id | 外鍵關聯 |
// 載入上次查詢條件
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
LoadLastQueryArgs(); // 從 Registry/設定檔還原控制項值
}
// 關閉時儲存
protected override void OnFormClosing(FormClosingEventArgs e)
{
SaveLastQueryArgs();
base.OnFormClosing(e);
}
BaseQueryForm 以 *.pcs XML 配置驅動 UI 產生 + QueryBuilder 構造條件 + 子類實作 BuildLists 實現查詢視窗標準化。新增查詢視窗僅需:建立 *.pcs、建立子類實作 3~4 個虛擬方法、註冊查詢按鈕事件。配合 FormatValue 統一枚舉/日期顯示,GetInfoFields 對應結果欄位,開發效率大幅提升。