2016-04-25 36 views
0

我正在嘗試使用comboboxdatagridview上創建一個過濾器。我想要做的是過濾datagridview中的過濾數據。我有五個comboboxes過濾。vb.net中的數據過濾

例如,第一個combobox是年份,那麼我仍然想要將搜索過濾爲年級,然後過濾到部分等。因此,用戶將能夠從數據庫中排序或過濾他的搜索。

到目前爲止,我有我的存儲過程代碼,並在組合框中試過。 SchoolYear,年級,部分,性別過濾效果良好..除了帳戶過濾外,還有兩種可能的輸入活動和非活動。

當我選擇Active進行過濾時,有一些不活動的記錄顯示,否則不活動的過濾沒有問題。

我的存儲過程的代碼:

ALTER PROCEDURE [dbo].[uspYearGradeFilter] 
    @Year Nvarchar(20)= NULL, 
    @Grade Nvarchar(20) = NULL, 
    @Section Nvarchar(20)= NUll, 
    @Gender Nvarchar(20)= NULL, 
    @Account Nvarchar(20) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     si.StudentID, si.Surname, si.FirstName, 
     si.MiddleName, si.Gender, si.BirthDay, si.TelNum, 
     Birthday, getdate() AS [Today], 
     Datediff(yy, BirthDay, getdate()) - 
      CASE 
       WHEN DATEADD(YY, DATEDIFF(YY, BirthDay, getdate()), BirthDay) 
       > GETDATE() 
        THEN 1 
        ELSE 0 
      END AS [age] 
    FROM 
     StudentInformation si 
    JOIN 
     StudentHistory sh ON si.StudentID = sh.StudentID 
    WHERE 
     sh.SchoolYear LIKE COALESCE('%'+ @Year+'%', sh.SchoolYear) 
     AND sh.Levels LIKE COALESCE('%' + @Grade + '%', sh.Levels) 
     AND siGender LIKE COALESCE('%' + @Gender + '%', si.gender) 
     AND sh.Section LIKE COALESCE('%' + @Section + '%', sh.Section) 
     AND si.account LIKE COALESCE('%' + @Account + '%', si.account) 
END 

我的vb.net代碼

Private Sub BindGrid() 
     Using cmd As New SqlCommand("dbo.uspYearGradeFilter", cn) 

      cmd.CommandType = CommandType.StoredProcedure 

      'Add a parameter for all comboboxes but only if a value is selected: 

      If cboYear.SelectedIndex >= 0 Then 
       Dim paramYear As New SqlParameter("@Year", SqlDbType.NVarChar, 20) 
       paramYear.Value = cboYear.Text 
       cmd.Parameters.Add(paramYear) 
      End If 

      If cboGrade.SelectedIndex >= 0 Then 
       Dim paramGrade As New SqlParameter("@Grade", SqlDbType.NVarChar, 20) 
       paramGrade.Value = cboGrade.Text 
       cmd.Parameters.Add(paramGrade) 
      End If 
      If cboSection.SelectedIndex >= 0 Then 
       Dim paramSection As New SqlParameter("@Section", SqlDbType.NVarChar, 20) 
       paramSection.Value = cboSection.Text 
       cmd.Parameters.Add(paramSection) 
      End If 
      If cboGender.SelectedIndex >= 0 Then 
       Dim paramGender As New SqlParameter("@Gender", SqlDbType.NVarChar, 20) 
       paramGender.Value = cboGender.Text 
       cmd.Parameters.Add(paramGender) 
      End If 
      If cboAccount.SelectedIndex >= 0 Then 
       Dim paramAccount As New SqlParameter("@Account", SqlDbType.NVarChar, 20) 
       paramAccount.Value = cboAccount.Text 
       cmd.Parameters.Add(paramAccount) 
      End If 


      da.SelectCommand = cmd 
      dt.Clear() 
      da.Fill(dt) 
      dgv1.DataSource = dt 

     End Using 
    End Sub 

可有人請幫我找出什麼是錯我的代碼。我只是無法理解,因爲我知道邏輯幾乎相同。謝謝

回答

1

你是說帳戶值設置爲活動或不活動?

AND Si.account LIKE COALESCE(@Account + '%', si.account) 
+0

太感謝你了:如果是這樣,不活動的帳戶可能因爲您使用

AND Si.account LIKE COALESCE('%' + @Account + '%', si.account) 

您可能需要嘗試去掉開頭的「%」和使用以下行有所回升。我沒有注意到這一點。有用 :-) –