2010-10-15 97 views
2

我對winforms和C#都比較陌生,我正在開發一個允許用戶執行搜索的應用程序。要搜索他們可以使用下面的數據:對搜索條件使用組合框

-Combobox有6個選項

-text箱,他們將根據所選擇的組合框搜索輸入信息。

我有一個存儲過程,每個搜索選項都有一個參數。該過程適用於搜索任何選項。該過程已添加到項目中,並通過TableAdapter連接到該項目。

我正在努力的是將這些搜索條件中的每一個傳遞給代碼的最佳方式。我開始這樣說:

public void DataRefresh(string searchCombo, string searchValue) 
    { 
     string returnMessage = string.Empty; 
     switch (searchCombo) 
     { 
      case "Acct": 
       Data.Manager.TAM.SearchDataTableAdapter.Fill(DataSet.spSearchData, ref returnMessage, searchValue, null, null, null, null, null); 
       break; 
     } 
     SearchDataBindingSource.DataSource = DataSet.spSearchData; 
    } 

我最初想我可以使用開關/箱通過基於什麼已經被用戶發送的參數。

有沒有更好的方法來做到這一點?我在想是的,但我似乎無法想出一個辦法。

任何建議將是偉大的!

回答

1

我想出了另一種方式來做到這一點,而不是將6個參數傳遞給存儲過程,我改變它只傳遞兩個組合框值和文本框值。然後我把存儲過程中的If語句處理正在傳遞的值。

感謝您的幫助。

1

您的代碼示例顯示您沒有將GUI,業務邏輯,域對象和數據層彼此分開。這將是一個更靈活的架構設計,但無論如何,這不是您的問題的關注。

在我看來,searchCriteria可能是一個對象,因此使其可用於其他搜索。

遵循@ saurabh的建議,可以使它更簡單,如果您使用的是.NET 3.5,則可以在搜索中使用Linq查詢。

然後,你的組合框應包含這個搜索對象的屬性名稱,那麼你可以隨便去,如:

public void DataRefresh(string comboBoxPropertyName, object value) { 
    var query = from s in searchResults 
       where (s.GetType().GetProperties()[comboBoxPropertyName].GetValue(s) = value) 
       select s 

    SearchDataBindingSource.DataSource = query.ToList(); 
} 

其中searchResults代表你的SP的結果。我不知道,你的TableAdapter可能需要演員陣容。我從來沒有用過這個課。

聲明:此代碼是從頭開始編譯的。這個代碼的目的只是表達一個觀點,不應該被認爲是絕對的解決方案,因爲我不知道這是否可以讓你以你決定使用的對象的方式工作,但我希望這簡化了你的方式。