2010-10-15 99 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可能需要演员阵容。我从来没有用过这个课。

声明:此代码是从头开始编译的。这个代码的目的只是表达一个观点,不应该被认为是绝对的解决方案,因为我不知道这是否可以让你以你决定使用的对象的方式工作,但我希望这简化了你的方式。