K3JAE Ответов: 1

Возврат даты в результатах поиска


У меня есть различные поля поиска в моей программе (по одному на форму), которые закодированы для получения результатов различными методами, и это прекрасно работает, пока возвращаемые результаты находятся в целочисленном формате. Моя текущая проблема заключается в том, что я работаю над новой формой и мне нужно поле поиска, чтобы вернуть результаты по REPAIR_DATE, которое является полем DateTime.

мой текущий код выглядит следующим образом:

<pre>    Private Sub btnSearch_Click(sender As System.Object, e As System.EventArgs) Handles btnSearch.Click
        Cursor = Cursors.WaitCursor
        Dirty()

        If cbColName.Text = "SEARCH BY:" Then
            MeMsgBoxSearchCriteria.ShowDialog()
        Else : lbSearchResults.Items.Clear()
            Select Case MaintenanceDataSet.Maintenance_Table.Columns(cbColName.Text).DataType
                Case GetType(Integer)
                    DV.RowFilter = cbColName.Text & " = " & tbSearchInput.Text.Trim
                Case GetType(Date)
                    DV.RowFilter = cbColName.Text & " = #" & tbSearchInput.Text.Trim & "#"
                Case Else
                    DV.RowFilter = cbColName.Text & " LIKE '*" & tbSearchInput.Text.Trim & "*'"
            End Select

            If DV.Count > 0 Then
                For IX As Integer = 0 To DV.Count - 1
                    lbSearchResults.Items.Add(DV.Item(IX)("ID"))
                Next
                If DV.Count = 1 Then
                    lbSearchResults.SelectedIndex = 0
                    Dim ix As Integer = MaintenanceDataSetBindingSource.Find("ID", CInt(lbSearchResults.SelectedItem.ToString))
                    MaintenanceDataSetBindingSource.Position = ix
                Else
                    lbSearchResults.Visible = True
                    lbSearchResults.BringToFront()
                End If
            Else
                ' Display a message box noting the search criteria is not found.   
                MeMsgBoxNoSearch.ShowDialog()
            End If
        End If
        Cursor = Cursors.Default
    End Sub

    Private Sub lbSearchResults_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lbSearchResults.SelectedIndexChanged
        Dim ix As Integer = MaintenanceDataSetBindingSource.Find("ID", CInt(lbSearchResults.SelectedItem.ToString))
        MaintenanceDataSetBindingSource.Position = ix
        lbSearchResults.Visible = False
    End Sub


Я ищу, чтобы вернуть результаты, основанные на столбце REPAIR_DATE.

Что я уже пробовал:

Я попытался переопределить «ix as Integer» на «ix as Date» и изменить «CInt (lbSearchResults.SelectedItem.ToString)» на «CDate (lbSearchResults.SelectedItem.ToString)», и это значение типа «integer» невозможно. преобразовано в 'date' "Я все еще новичок в VB и не уверен, как правильно вернуть результаты REPAIR_DATE, а не целые числа. Я получаю результаты по дате в моем списке (когда я использую REPAIR_DATE в качестве поля сортировки, но с кодом, установленным, как у меня выше, но при нажатии на один из возвращенных результатов для загрузки этой записи это приводит к тому, что программа прервать работу с указанной выше ошибкой, главным образом потому, что он пытается вернуть число, а не дату. Я понимаю, почему это не удается, я просто не знаю, как исправить.

1 Ответов

Рейтинг:
0

Maciej Los

Цитата:
Я попытался переопределить "ix как целое число" на "ix как дату" и изменить "CInt(lbSearchResults.SelectedItem.ToString)" к "CDate(lbSearchResults.SelectedItem.ToString)"и это ошибки с "значение типа 'integer' не может быть преобразовано в 'date'"

Сообщение об ошибке совершенно ясно. Предполагая, что ID поле - это тип целого числа,вы не можете неявно преобразовать его в тип данных date/datetime.
Вы должны обратиться к REPAIR_DATE поле в соответствии с процедурой.

Обратите внимание, что в вашем коде есть несколько других проблем:

  1. ToString() метод избыточен:
    Dim ix As Integer = MaintenanceDataSetBindingSource.Find("ID", CInt(lbSearchResults.SelectedItem.ToString))
  2. чтобы отфильтровать данные по дате, я бы предложил изменить ваш код:
    DV.RowFilter = cbColName.Text & " = #" & tbSearchInput.Text.Trim & "#"

    к:
    Dim ci As CultureInfo = CultureInfo.InvariantCulture
    Dim stringDate As String = tbSearchInput.Text.Trim
    DV.RowFilter = String.Format("{0}=#{1}#", cbColName.Text, stringDate.Format("yyyy/MM/dd", ci))

    Хорошей практикой программирования является использование формата ISO datetime. В зависимости от ситуации вам может понадобиться добавить временную часть.
    Вы можете посмотреть здесь: vb.net - как использовать BindingSource.Фильтр для даты в visual basic 2012? - переполнение стека[^]




Удачи вам!


K3JAE

Re пункт 1: по вашему предложению: убрал .метод toString.
Пункт 2: внес предложенное изменение, спасибо за эту информацию. Хорошо знать.

Повторите первоначальный вопрос: я не совсем уверен или не понимаю, что вы имеете в виду, когда говорите: "вы должны ссылаться на поле REPAIR_DATE в соответствии с процедурой." Я думал, что уже делал это раньше, но безуспешно. Не могли бы вы быть немного конкретнее с тем, что вы предлагаете?

Я ищу результат любого поиска, чтобы вернуться только с датой ремонта (список дат, если несколько возвратов по критериям поиска). В настоящее время я возвращаюсь только с идентификатором записи или идентификаторами.

Я очень ценю вашу помощь. Как я уверен, вы, очевидно, можете сказать, я не очень опытный программист и все еще изучаю новые вещи ежедневно.

Maciej Los

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

K3JAE

Есть успехи в решении моей проблемы? Я все еще не могу показаться, чтобы получить REPAIR_DATE, чтобы показать в результатах моего поиска. Просто спрашиваю, как напоминание.

Maciej Los

Нет. Я не могу воспроизвести вашу проблему. ;(

K3JAE

Может быть, поможет больше кода страницы? Я действительно задаюсь вопросом, не делаю ли я здесь что-то совершенно неправильное. Я хочу вернуть результаты, основанные на дате ремонта, а не на идентификаторе? Поэтому мне нужно выяснить, как это сделать правильно.