Member 13890537 Ответов: 1

Как фильтровать datagridview с помощью VB.NET а госпожа Аксес?


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

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

Это мой стол.
Position       Country          Status

IT Staff        Japan            Hired
Teacher        Germany           Not Hired
IT Staff        Mexico           Hired


когда я набираю в своем текстовом поле "нанят" в моем Datagridview показывает

IT Staff          Japan            Hired
IT Staff          Mexico           Hired

Я только хочу показать в своем datagridview весь ИТ-персонал в Японии, который нанят.

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

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
      If ComboBox1.Text = "Country" Then
          If ComboBox2.Text = "Japan" Then
              Status()
          End If
      End If
  End Sub



Public Sub Status()
      Try
          Dim sCon As String = String.Format("Provider= Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\db.accdb")
          Dim str As String = "SELECT * FROM dbtable WHERE Status = @S"
          Dim dt As New DataTable

          Using con1 As OleDbConnection = New OleDbConnection(sCon)
              con1.Open()
              Using cmd1 As OleDbCommand = New OleDbCommand(str, con1)
                  With cmd1.Parameters
                      .Add("@S", OleDbType.VarChar).Value = TextBox1.Text
                  End With
                  Dim adp As New OleDbDataAdapter(cmd1)
                  adp.Fill(dt)
                  DataGridView1.DataSource = dt
              End Using
              con1.Close()
          End Using
      Catch ex As Exception
          MsgBox(ex.Message)
      End Try
  End Sub

CHill60

Является ли ваша таблица dbtable местом хранения информации о вашем "персонале" - как выглядит эта таблица?
Вы хотите настроить источник данных для DataGridView1 или отфильтровать DataGridView1
Я думаю, что нам нужно немного больше деталей о том, что вы пытаетесь сделать, прежде чем мы сможем вам помочь

Member 13890537

Спасибо, что ответили, теперь я знаю, почему никто не отвечает на мой вопрос. Я уже обновил некоторые детали и ищу способ фильтрации DataGridview1

Member 13890537

о нет! никто не хочет отвечать на мой вопрос.

1 Ответов

Рейтинг:
4

Richard Deeming

Попробуйте что-нибудь вроде этого:

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

Public Sub Status()
    ' TODO: Move this to the application's configuration file:
    Const sCon As String = "Provider= Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\db.accdb"
    
    Using con As OleDbConnection = New OleDbConnection(sCon)
        Using cmd As OleDbCommand = New OleDbCommand("", con)
            Dim str As String = "SELECT * FROM dbtable WHERE Status = @S"
            cmd.Parameters.Add("@S", OleDbType.VarChar).Value = TextBox1.Text
            
            If ComboBox1.Text = "Country" Then
                str = str & " AND Country = @Country"
                cmd.Parameters.Add("@Country", OleDbType.VarChar).Value = ComboBox2.Text
            End If
            
            cmd.CommandText = str
            
            Dim dt As New DataTable
            Dim adp As New OleDbDataAdapter(cmd)
            adp.Fill(dt)
            
            DataGridView1.DataSource = dt
        End Using
    End Using
End Sub


Member 13890537

Спасибо Вам, мистер Ричард, что считаете, что это работает. Прежде чем я не знаю, как это сделать, примените этот str = str & "и Country = @Country", пока вы не покажете мне, как это сделать, поэтому я попытаюсь использовать этот код.

Dim dv как новый DataView(dt)
dv.RowFilter = "Страна ="Япония" и статус="нанят""
DataGridView1.Источник данных = ДВ

и это работает
Но я хочу, чтобы combobox1 и combobox2 были идентификаторами, а textbox1 и textbox2-данными имени столбца.
но
Я не уверен, как поместить это в мой 2 combobox = ColumnName и в мой 2 textbox = Data столбца. Должен ли я использовать условие IF, чтобы заставить его работать?

Поэтому я стараюсь и ошибаюсь
этот код работает. Я знаю, что использовать строку - это плохо.
dv.RowFilter = "страна как '%" + TextBox1.Text + "%' и статус как '%" + TextBox2.Text + "%'"
Но это, не знаю, как сделать этот код. Я пытаюсь найти короткий путь, если он есть?
ДВ.RowFilter = Элемент Combobox1.Текст &ампер; " = " &амп; текстовое поле textbox1.Текст & "и" &АМП; ComboBox2.Текст &ампер; " = " &амп; поле textbox2.Текст это сказать, система.Данных.SyntaxErrorException: 'синтаксическая ошибка: отсутствует операнд после оператора StaffAndCountry'.'


Я планирую потратить > 8 часов на попытки и ошибки, чтобы понять эту проблему, пока не прочитаю ваш код. Еще раз большое вам спасибо, Мистер, и желаю вам хорошего и здорового дня. Но все же я пытаюсь понять, возможно ли это?

У меня есть небольшой вопрос о методе, который вы используете. В чем разница между этим и использованием .RowFilter ?
Примечание: это нормально, если вы не хотите отвечать на этот вопрос, потому что когда-нибудь я это выясню. ^_^ Еще раз спасибо, Мистер

Richard Deeming

ДВ.RowFilter = Элемент Combobox1.Текст &ампер; " = " &амп; текстовое поле textbox1.Текст & "и" &АМП; ComboBox2.Текст &ампер; " = " &амп; поле textbox2.Текст

Вы пропускаете пробелы вокруг And оператор и кавычки вокруг значений. Попробуй:

dv.RowFilter = ComboBox1.Text & " = '" & TextBox1.Text & "' And " & ComboBox2.Text & " = '" & TextBox2.Text & "'"


Вы правы, что использование конкатенации строк в запросе - это плохо. Но в этом случае фильтр вычисляется локально; недопустимые входные данные не могут выдать мошеннический запрос к вашей базе данных. И RowFilter у него нет понятия параметров, поэтому у вас нет альтернативы.

Member 13890537

Это означает, что безопасно использовать конкатенацию строк с помощью RowFilter.
Еще раз спасибо, что это работает! Я помещу это в свою папку скриншотов ошибок для записи.

С точки зрения Мистера Диминга, что лучше использовать или хорошо практиковать? RowFilter или решение, которое вы дали с помощью параметров?

Я счастлив, что сегодня снова учусь.
Как вы научились этому или приобрели это на собственном опыте?
Желаю вам отличного и здорового дня мистер

Richard Deeming

Если вы фильтруете данные, которые уже были загружены, и вас не беспокоят записи, которые были добавлены в базу данных с момента загрузки данных, то RowFilter наверное, так будет лучше.

Member 13890537

Я обнаружил проблему этого RowFilter, когда я пытаюсь ввести эти данные в свою базу данных " Япония и должность, которую я не обслуживаю. Затем попробуйте найти это с помощью rowfilter, он говорит, что есть ошибка, говорит отсутствующий операнд после "Japan". Нет никакой ошибки, если я ищу слово без единой строки.
Кстати можно ли сделать этот короткий ДВ код.RowFilter = Элемент Combobox1.Текст + " как '%" + текстовое поле textbox1.Текст + "%' И " + ComboBox2.Текст + " как '%" + поле textbox2.Текст + "%' и DateandTime1 &ГТ;='" + DateTimePicker1.Значение + "' и DateandTime1 &ЛТ;='" + DateTimePicker2.Значение + "'" с помощью параметров?

Еще раз спасибо Мистер Диминг
Желаю вам отличного и здорового дня мистер

Richard Deeming

К сожалению, с тех пор как RowFilter не поддерживает параметры, вам нужно будет "экранировать" одинарные кавычки, удваивая их.

Даты требуют особого форматирования - их нужно завернуть в бумагу. # символы, а также использовать американский формат "ММ/ДД/гггг".

Попробуйте что-нибудь вроде этого:

dv.RowFilter = string.Format("{0} Like '%{1}%' And {2} Like '%{3}%' And DateandTime1 >= #{4:MM/dd/yyyy}# And DateandTime1 <= #{5:MM/dd/yyyy}#",
    ComboBox1.Text, TextBox1.Text.Replace("'", "''"),
    ComboBox2.Text, TextBox2.Text.Replace("'", "''"),
    DateTimePicker1.Value, DateTimePicker2.Value);


Документация по синтаксису фильтра доступна в разделе DataColumn.Expression замечания:
https://docs.microsoft.com/en-gb/dotnet/api/system.data.datacolumn.expression?view=netframework-4.7.2#expression-syntax[^]

Member 13890537

Он работает так же, как и параметр.
Я читал это письмо
http://www.csharp-examples.net/dataview-rowfilter/
Статья, но еще не прочитанная. Я еще не знаю, как закодировать это так, как вы это кодируете. Кстати, в чем смысл(цель) этого слова?"{0}, '%{1}%', {2}, '%{3}%' ,4: ,5: в этой строке кода dv.RowFilter = string.Формат ("{0} Как '%{1}%' и {2} как '%{3}%' и DateandTime1 >= #{4:MM/dd/yyyy}# и DateandTime1 <= #{5:MM/dd/yyyy}#",? Так что я могу понять больше

Еще Раз Спасибо Мистер Диминг
Я действительно ценю вашу помощь
Желаю вам отличного и здорового дня мистер

Member 13890537

Добрый День Мистер Диминг
Спасибо за ссылки и я уже начинаю ее читать

Если у меня есть еще один вопрос, Могу я задать его вам снова?

Желаю вам здорового и отличного дня мистер


Richard Deeming

Лучше всего опубликовать его как новый вопрос. Таким образом, другие люди тоже могут помочь. :)

Member 13890537

Хорошо ^_^ большое спасибо, что ответили на все мои вопросы. Ваш лучший Мистер Диминг

Желаю вам отличного и здорового дня мистер