vb.net中的数据过滤

时间:2016-04-25 13:17:05

标签: sql-server vb.net

我尝试使用datagridviewcombobox上创建过滤器。我想要做的是过滤datagridview中的过滤数据。我有五个comboboxes用于过滤。

例如,第一个combobox是年份,那么我仍然希望将搜索过滤到年级,然后过滤到部分,依此类推。因此,用户将能够从数据库中对其搜索进行排序或过滤。

到目前为止,我有我的存储过程代码并在组合框中尝试过。 SchoolYear,Grade,Section,Gender过滤效果很好..除了帐户过滤外,有两种可能的输入是Active和inactive。

当我选择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 个答案:

答案 0 :(得分:1)

您是说帐户值设置为有效还是无效?如果是这样,可以选择非活动帐户,因为您正在使用

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

您可能想尝试删除前导'%'并改为使用以下行:

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