VB .net过滤datagridview数据源是存储过程sql pivot

问题描述 投票:0回答:1

有人可以帮我这个代码吗?我有一个存储过程,它返回一个连接日历的对象列表:

DECLARE @cols AS NVARCHAR(MAX)
DECLARE @cale AS NVARCHAR(MAX)
DECLARE @ini AS DATETIME
DECLARE @fin AS DATETIME

SET @ini = (SELECT MIN(VerAvv) FROM CalendariVer)
SET @fin = (SELECT MAX(VerSca) FROM CalendariVer)


SELECT @cols = STUFF((SELECT ',' + QUOTENAME(CONVERT(NVARCHAR(10), Data, 103))
                FROM Calendario WHERE Data BETWEEN CAST(@ini AS DATE)
                AND CAST(@fin AS DATE)
                GROUP BY Data
                ORDER BY Data
                FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')


SET @cale = 'SELECT CalId, PiaId, PiaAcr, VerId, VerCod, Ver, Avvio, Chiusura, '+@cols+'
FROM            (SELECT dbo.CalendariVer.CalId, dbo.CalendariVer.PiaId, dbo.CalendariVer.PiaAcr, dbo.CalendariVer.VerId, dbo.CalendariVer.VerCod, dbo.CalendariVer.Ver, CONVERT(nvarchar(10), dbo.CalendariVer.VerAvv, 103) AS Avvio, 
                 CONVERT(nvarchar(10), dbo.CalendariVer.VerSca, 103) AS Chiusura, CONVERT(NVARCHAR(5), dbo.CalendariVer.LezDal, 108) + '' - '' + CONVERT(NVARCHAR(5), dbo.CalendariVer.LezAl, 108) AS Orario, 
                 CONVERT(nvarchar(10), dbo.Calendario.Data, 103) AS Data
                 FROM dbo.CalendariVer RIGHT OUTER JOIN
                      dbo.Calendario ON CAST(dbo.CalendariVer.Lez AS date) = dbo.Calendario.Data
         WHERE CalID IS NOT NULL                                                    
                 GROUP BY dbo.CalendariVer.CalId, dbo.CalendariVer.PiaId, dbo.CalendariVer.PiaAcr, dbo.CalendariVer.VerId, dbo.CalendariVer.VerCod, dbo.CalendariVer.Ver, CONVERT(nvarchar(10), dbo.CalendariVer.VerAvv, 103), 
                 CONVERT(nvarchar(10), dbo.CalendariVer.VerSca, 103), CONVERT(NVARCHAR(5), dbo.CalendariVer.LezDal, 108) + '' - '' + CONVERT(NVARCHAR(5), dbo.CalendariVer.LezAl, 108), CONVERT(nvarchar(10), 
                 dbo.Calendario.Data, 103)) AS c
            PIVOT (MAX(Orario) FOR Data IN ('+@cols+')) AS p'

EXEC (@cale)

一切工作。我在vb中有一个函数回忆:

Public Function Calendario_Ver() As DataTable
    Dim cale As New DataTable()

    Try
        Acon()
        Dim cal As New SqlCommand("CalendarioVer", con)
        cal.CommandType = CommandType.StoredProcedure
        Dim trova As New SqlDataAdapter(cal)
        trova.Fill(cale)
        Ccon()
    Catch ex As Exception
        Interaction.MsgBox(ex.ToString, MsgBoxStyle.Critical)
    End Try

    Return cale
End Function

并使用以下代码填充DataGridView:

Private Sub CaricaCalendario()
    Try
        With CalVerDataGridView
            .Refresh()
            .DataSource = Calendario_Ver()
            .Columns(0).Visible = False
            .Columns(1).Visible = False
            .Columns(3).Visible = False
            .Columns(2).HeaderText = "Piano"
            .Columns(4).HeaderText = "Progetto"
            .Columns(5).HeaderText = "Versione"
        End With
    Catch ex As Exception
        Interaction.MsgBox(ex.ToString, MsgBoxStyle.Critical)
    End Try
End Sub

一切都工作,但我如何通过列pianoversionever过滤数据源或datagridview?

sql-server vb.net datagridview
1个回答
0
投票

一旦你有了DataTable,数据如何到达那里是无关紧要的。将DataTable绑定到BindingSource并将其绑定到网格。要过滤数据,请设置FilterBindingSource属性。

如果你真的想在没有BindingSource的情况下这样做,请将表格直接绑定到网格并设置DefaultView.RowFilterDataTable

例如:

myBindingSource.DataSource = myDataTable
myDataGridView.DataSource = myBindingSource

myBindingSource.Filter = $"SomeColumn LIKE '%{myTextBox.Text}%'"
© www.soinside.com 2019 - 2024. All rights reserved.