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

C# WinForms 查詢視窗框架 BaseQueryForm:配置驅動動態查詢與結果顯示

     編輯:關於C#

設計目標

提供標準化查詢視窗:

  • 動態產生查詢條件 UI(文字框、下拉、日期、枚舉)。
  • 支援多種查詢邏輯(AND/OR、等於/模糊/範圍)。
  • 結果清單欄位、寬度、格式化由配置檔定義。
  • 支援雙擊回傳實體、分頁、多選。

核心屬性

屬性說明
DisplayResultList查詢後是否顯示結果清單
MultiResult是否允許多選回傳
QueryBuilder查詢條件構造器(供外部取得)
ResultList查詢回傳的實體集合
ConfigFileName查詢配置檔 (*.pcs)

查詢配置檔 (*.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 存實體
    }
}

查詢條件型別對應表

TypeUI 控制項查詢邏輯適用場景
StringTextBoxLIKE %value%模糊查詢
StringExactTextBox= value精確代碼
Int/DecimalNumericUpDown= value精確數值
IntRange/DecimalRange兩個 NumericUpDownBETWEEN min AND max範圍查詢
Date/DateTimeDateTimePicker= value (日期部分)單一日期
DateRange兩個 DateTimePickerBETWEEN start AND end日期區間
EnumComboBox= value狀態/類型
BoolCheckBox (三態)= true/false是否標記
ReferenceButton + 彈出選擇視窗= 選中實體.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 對應結果欄位,開發效率大幅提升。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved