Фильтры Datagridview в VB.net - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь отфильтровать datagridview, содержащий рейсы, выбирая период времени, маршрут или бюджет.

Кажется, код работает нормально для маршрута (RotaID), но не для дат (DataHoraPartida) или бюджет (PrecoBase).

Это код

Public Class FormProcurarViagem
    Private ListaViagens As New Viagens
    Private ListaRotas As New Rotas

    Private DataSetTemp As New DataSet()

    Private DataSource2Grid As New BindingSource()


    Public Event EnviaDadosViagem(ByVal NovaReservaViagem As ReservaViagem)

        Private Sub FormReservas_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ListaViagens = LerXML_Viagens()
        Me.ViagensBindingSource.DataSource = ListaViagens

        FillGrid()


        ListaRotas = LerXML_Rotas()

        With ComboBox1
            .DisplayMember = "RotaID"
            .ValueMember = "RotaID"
            .DataSource = ListaRotas
            .DataBindings.Add("SelectedValue", ViagensBindingSource, "RotaID", DataSourceUpdateMode.OnPropertyChanged)
        End With

        With ComboBox2
            Dim i As Integer
            Dim j As Integer

            For j = 0 To 10
                i = i + 50
                ComboBox2.Items.Add(i)
            Next j


        End With

        DateTimePicker1.Format = DateTimePickerFormat.Custom
        DateTimePicker1.CustomFormat = "yyyy/MM/dd"
        DateTimePicker2.Format = DateTimePickerFormat.Custom
        DateTimePicker2.CustomFormat = "yyyy/MM/dd"

    End Sub

    Private Sub FillGrid()

          DataSetTemp.ReadXml("Viagens.xml")


        Dim tables As DataTableCollection = DataSetTemp.Tables

        Dim view1 As New DataView(tables(0))

        ViagensDataGridView.AutoGenerateColumns = True

        Me.Controls.Add(ViagensDataGridView)



        ' Create a BindingSource and set its DataSource property to the DataView.

        DataSource2Grid.DataSource = view1


        ' Set the data source for the DataGridView.

        ViagensDataGridView.DataSource = DataSource2Grid

    End Sub


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        DataSource2Grid.Filter = String.Format("DataHoraPartida >= '{0:yyyy/MM/dd}' And DataHoraPartida <= '{1:yyyy/MM/dd}'", DateTimePicker1.Value.Date, DateTimePicker2.Value.Date)

    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        DataSource2Grid.Filter = "PrecoBase <=" & Me.ComboBox2.Text
    End Sub


    Private Sub ComboBox1_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboBox1.SelectionChangeCommitted

        DataSource2Grid.Filter = "RotaID like '%" & Me.ComboBox1.Text & "%'"
    End Sub


End Class

В источнике данных формат даты - гггг / ММ / дд ЧЧ: мм, а формат PrecoBase - вдвойне, я не знаю, является ли это причиной проблемы.

1 Ответ

0 голосов
/ 30 мая 2020

Если данные в вашем источнике данных не относятся к типу DateTime, то это должно быть так, поэтому вы должны сначала предпринять шаги, чтобы исправить это. Затем вы можете применить любое желаемое форматирование в сетке, установив свойство .DefaultCellStyle.Format столбца.

Когда у вас действительно есть данные правильного типа, вы можете правильно их отфильтровать в соответствии с документацией. Фактическая фильтрация Dates будет выглядеть следующим образом:

DataSource2Grid.Filter = String.Format("DataHoraPartida >= #{0:M/dd/yyyy}#' AND DataHoraPartida <= #{1:M/dd/yyyy}#", DateTimePicker1.Value, DateTimePicker2.Value)

DateTime литералы ВСЕГДА разделены символами #, и они ВСЕГДА отформатированы с использованием формата даты США, т.е. M/dd/yyyy. Также нет смысла указывать свойство Date двух значений, потому что формат уже отбрасывает время. Я также рекомендовал бы использовать строковую интерполяцию вместо String.Format в большинстве случаев, если вы используете VB 2015 (я думаю, или это может быть 2017) или более поздней версии:

DataSource2Grid.Filter = $"DataHoraPartida >= #{DateTimePicker1.Value:M/dd/yyyy}#' AND DataHoraPartida <= #{DateTimePicker2.Value:M/dd/yyyy}#"
...