2014-11-25 66 views
-1

在使用VB.NET的WinForms应用程序中,我已经从MS Access访问了三个表并将结果显示在DataGridView控件中。 现在,我使用三种不同的条件如下搜索访问记录:根据在表格中选择的不同条件搜索访问记录

  1. 复选框为******中国(如果选择相应的文本框将被启用)
  2. 复选框为ITEMNAME(如果选择相应的文本框将被启用)
  3. 三为年和月和日单选按钮(如果选择相应的DateTimePicker会启用)

下面这些条件,有一个搜索按钮。

在选择上述一个或两个或上述条件的组合后,输入值和搜索按钮,我想在DataGridView中显示结果。

用户只能选择第一个条件(PhoneNumber)或仅选择第二个条件(ItemName)或仅选择其中一个单选按钮(年/月/日),或者可以选择多个条件,然后只能选择搜索按钮。所以,用户可以有多种选择进行搜索。

我是否需要为访问Access记录(Else If语句)的每种可能的选择编写代码,如下所示?

If chkPhoneNumber.checked= True Then 
RunQuery("SELECT ...... WHERE txtPhoneNumber.Text = '...'") 
Elseif chkItemName.checked= True Then 
RunQuery("SELECT ...... WHERE txtItemName.Text = '...'") 
Elseif chkPhoneNumber.Checked= True ANd chkItemName.checked= True Then 
RunQuery("SELECT ...... WHERE txtPhoneNumber.Text = '..' And txtItemName.Text = '...'") 
'Similar search for others too 
Elseif rdbYear.checked= True Then 
RunQuery("....") 
Elseif rdbMonth.checked= True 
RunQuery("....") 
Elseif rdbDay.checked= True 
RunQuery("....") 
Elseif chkPhoneNumber.Checked= True ANd chkItemName.checked= True ANd rdbYear.checked= True 
RunQuery("....") 
Elseif .... 
Elseif .... 
Elseif .... 
Endif .... 

这样就会有很多可能的搜索组合。

我对这种语言较新。所以,请以简单的方式提供信息。

+0

去年你还是这个语言的新手http://stackoverflow.com/questions/26335616/automatic-reposition-of-controls-within-groupbox – user4259788 2014-11-25 10:35:51

回答

1

而不是使用IF-elseif的,你可以做这样的事情

Dim checkedControls As New List(Of Control) 

    For Each Control In Me.Controls 
     If TypeOf Control Is CheckBox AndAlso CType(Control, CheckBox).Checked Then 
      checkedControls.Add(CType(Control, CheckBox)) 
     End If 
    Next  

现在你把所有的检查控制,只要遍历列表中动态创建查询。

+0

对不起,先生,我不理解它。你可以解释更多,关于添加到列表类和动态查询。还有一个单选按钮控件。请帮助@prem – Tops 2014-11-25 15:00:22

0

如果可能,您将希望避免动态构建SQL语句(主要是因为它允许SQL注入漏洞和错误)。相反,SQL参数是最好的,而且查询本身应该被设计成只适用,如果它有一个有效的(非空/空)传入参数中的每个条件,例如查询的部分,例如:

PARAMETERS ParPhoneNumber Text (10), ParItemName Text (255); 
SELECT … 
FROM … 
WHERE Nz([PhoneNumber]=[ParPhoneNumber], True) AND Nz([ItemName]=[ParItemName], True); 

空传播意味着如果PhoneNumber本身或其相应的搜索参数为null *,那么[PhoneNumber]=[ParPhoneNumber]条件将为null,则Nz确保空传播停止为True。对于其他条件也是如此。

要传递的参数,这样的事情应该如果你使用OLEDB(未经测试)做的伎俩:

cmd.Parameters.AddWithValue("ParPhoneNumber", IIf(chkPhoneNumber.Checked, txtPhoneNumber.Text, DBNull)) 

(否则,查找但是你通过你正在使用以任何API参数.NET;这是一个单独的问题。)

*如果您希望排除记录中的空值,请首先使用Nz来创建与任何内容不匹配的内容(可能为Nz(Nz([PhoneNumber], "!!!!!!!!!!!!!!!!!")=[ParPhoneNumber], True))。但如果可能的话,最好做出最大的价值;数据中的空值并不是特别有趣。

相关问题