2013-09-13 3 views
2

Как выполнять поиск по столбцам в datagridview с помощью текстового поля? Я использую vb.net 2010. У меня есть Datagridview с источником данных. Ниже мой код для заполнения моего datagridview. Сетка будет иметь 4 столбца.Поиск по столбцам в datagridview с помощью текстового поля (vb.net)

Private Sub LoadProducts() 
    Dim CS As String = ConfigurationManager.ConnectionStrings("HRMS.My.MySettings.ResortDBConnectionString").ConnectionString 
    Using con As SqlConnection = New SqlConnection(CS) 
     Dim da As SqlDataAdapter = New SqlDataAdapter("sp_NET_GetProducts_CompanyID", con) 
     da.SelectCommand.CommandType = CommandType.StoredProcedure 
     da.SelectCommand.Parameters.AddWithValue("@CompanyID", CInt(ConfigurationManager.AppSettings("CompanyID"))) 

     Dim ds As DataSet = New DataSet 
     da.Fill(ds) 
     ds.Tables(0).TableName = "Products" 

     dgvProducts.DataSource = ds.Tables("Products") 
     dgvProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill 
     dgvProducts.AllowUserToResizeColumns = True 
     dgvProducts.Refresh() 
    End Using 
End Sub 

Требования: В моей форме я буду иметь textbox и button. Текстовое поле будет содержать строку поиска. Мне нужно, чтобы выделить строку, когда строка найдена.

Я не хочу открывать другое соединение, просто чтобы найти строку в наборе данных. Можно ли искать строковые значения непосредственно в datagridview?

ответ

2

Здесь у вас есть пример кода, делать то, что вы хотите:

Dim toSearch As String = "this" 
Dim colNum As Integer = 0 
Dim res = ds.Tables("Products").AsEnumerable.Where(Function(x) x.Item(colNum).ToString() = toSearch).ToArray 
For Each item In res 
    Dim curRow As Integer = ds.Tables("Products").Rows.IndexOf(item) 
    dgvSuppliers.Rows(curRow).DefaultCellStyle.BackColor = Color.Yellow 
Next 

Код выше ищет строку "this" в первом столбце Table "Products" и изменить BackColor из соответствующих строк в желтый цвет.

ПРИМЕЧАНИЕ: этот ответ намеревается ответить на вопрос OP так, как обычно «поиск термина в источнике данных» понимается, то есть, полагаясь на запрос. Кроме того, люди предпочитают решения, связанные с меньшим количеством строк. Эти две причины объясняют, почему я полагался на этот подход (это вместе с мужественностью OP). ОП решил ответить себе, что он считает лучше. Я лично предпочитаю итеративные решения, как тот, который он опубликовал (хотя я считаю, что такой подход очевиден для любого, кто использует DataGridView). В любом случае ничто не может быть сказано априори о том, какой вариант более эффективен, не зная точных условий (размера). Весь смысл этой заметки подчеркивает, что я не рекомендую регулярно полагаться на подходы, основанные на LINQ, просто написал то, что OP, по-видимому, искал (к сожалению, я довольно плохо разбираюсь в ожиданиях людей, не объясняющих ясно, что ищет и избегает любого общения).

1

Вы можете использовать BindingSource для вашего требования.Так что ваш код будет выглядит, как показано ниже,

  • Declare (Public)

    Dim ds As New DataSet 
    Dim bndSourceGrid As New BindingSource() 
    
  • Заполните dgvProducts с BindingSource

    Private Sub LoadProducts() 
    Dim CS As String = ConfigurationManager.ConnectionStrings("HRMS.My.MySettings.ResortDBConnectionString").ConnectionString 
    
    Using con As SqlConnection = New SqlConnection(CS) 
    Dim da As SqlDataAdapter = New SqlDataAdapter("sp_NET_GetProducts_CompanyID", con) 
    da.SelectCommand.CommandType = CommandType.StoredProcedure 
    da.SelectCommand.Parameters.AddWithValue("@CompanyID", CInt(ConfigurationManager.AppSettings("CompanyID"))) 
    
    
    da.Fill(ds) 
    ds.Tables(0).TableName = "Products" 
    
    '/*-------------------------------------------- 
    bndSourceGrid.DataSource = ds.Tables("Products") 
    dgvProducts.DataSource = bndSourceGrid 
    '/*-------------------------------------------- 
    
    dgvProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill 
    dgvProducts.AllowUserToResizeColumns = True 
    dgvProducts.Refresh() 
    End Using 
    
    End Sub 
    
  • Гото txtboxSerach и на это TextChanged событие

    Private Sub txtboxSeracht_TextChanged(ByVal sender As Object, ByVal e As 
        System.EventArgs) Handles txtSearchCust.TextChanged 
         '/*here "Name" is the column that you want filter/search 
        bndSourceGrid.Filter = String.Format("{0} LIKE '{1}%'", "Name", 
        txtboxSerach.Text) 
         '/* sorting method ascending/descending 
        bndSourceGrid.Sort = "Name ASC" 
        End Sub 
    
  • Гото txtboxSerach и это Подтверждено событие

    Private Sub txtboxSerach_Validated(ByVal sender As Object, ByVal e As 
             System.EventArgs) Handles txtboxSerach.Validated 
         If txtboxSerach.Text = String.Empty Then 
          bndSourceGrid.RemoveFilter() 
         Else 
          bndSourceGrid.Filter = String.Format("{0} = '{1}'", "Name", 
          txtboxSerach.Text) 
         bndSourceGrid.Sort = "Name ASC" 
         End If 
        End Sub 
    

  • Результат
    мой DataGridView выглядит, как показано ниже

    ID Name Other 
    --------------- 
    0 Abcd 321 
    1 Abdc 546 
    2 Bcdsf 1005 
    


    Когда я начинаю печатать письмо A в txtBoxSerach

    ID Name Other 
    --------------- 
    0 Abcd 321 
    1 Abdc 546 
    
+0

Можно добавить здесь 'WHERE' заявление? –

+0

@ChadPatrick https://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.filter(v=vs.110).aspx –

Смежные вопросы