2013-01-04 2 views
1

데이터를 표시하는 DataGridview과 입력 된 문자열을 기반으로 데이터를 표시하는 SQL 쿼리로 BindingSource을 필터링 할 수있는 TextBox이 있습니다. 이것은 모든 데이터가 다시 표시되도록 다시 설정하고있는 타이머 기능을 DataGridView으로 필터링 한 후에는 별개로 작동합니다. 타이머는 1000ms 기준으로 설정되므로 필터링 된 결과가 잠시 표시된 다음 되돌릴 수 있습니다.DataGridView 및 BindingSource 타이머 문제

Heres는 내 코드 :

Imports System.Data.OleDb 

Public Class Form1 

    Dim duraGadgetDB As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = C:\Users\Dave\Documents\duraGadget.mdb;" 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Dim sql As String = "SELECT * FROM duragadget" 
     Dim connection As New OleDbConnection(duraGadgetDB) 
     Dim dataadapter As New OleDbDataAdapter(sql, connection) 
     Dim ds As New DataSet() 
     connection.Open() 
     dataadapter.Fill(ds, "dura") 
     connection.Close() 
     DataGridView1.DataSource = ds 
     DataGridView1.DataMember = "dura" 
     DataGridView1.Columns(5).Width = 300 
    End Sub 

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
     insert.Show() 
    End Sub 

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
     Dim currentRowID As Integer 
     Dim scrollPosition As Integer = DataGridView1.FirstDisplayedScrollingRowIndex 
     Try 
      If DataGridView1.CurrentRow IsNot Nothing Then 

       currentRowID = DataGridView1.CurrentRow.Index 

       Dim sql As String = "SELECT * FROM duragadget" 
       Dim connection As New OleDbConnection(duraGadgetDB) 
       Dim dataadapter As New OleDbDataAdapter(sql, connection) 
       Dim ds As New DataSet() 
       connection.Open() 
       dataadapter.Fill(ds, "dura") 
       connection.Close() 
       DataGridView1.DataSource = ds 
       DataGridView1.DataMember = "dura" 
       DataGridView1.CurrentCell = DataGridView1.Item(1, currentRowID) 
      End If 
     Catch ex As Exception 

     End Try 
     DataGridView1.FirstDisplayedScrollingRowIndex = scrollPosition 
    End Sub 

    Private Sub txtSearchOnSku_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearchOnSku.TextChanged 
     Dim currentRowID As Integer 
     Dim scrollPosition As Integer = DataGridView1.FirstDisplayedScrollingRowIndex 
     Try 
      If DataGridView1.CurrentRow IsNot Nothing Then 
       currentRowID = DataGridView1.CurrentRow.Index 
       Dim sql As String = "SELECT * FROM duragadget" 
       Dim connection As New OleDbConnection(duraGadgetDB) 
       Dim dataadapter As New OleDbDataAdapter(sql, connection) 
       Dim ds As New DataSet() 
       Dim dsView As New DataView 
       Dim bs As New BindingSource() 
       connection.Open() 
       dataadapter.Fill(ds, "dura") 
       connection.Close() 
       dsView = ds.Tables(0).DefaultView 
       bs.DataSource = dsView 
       bs.Filter = "skuNo LIKE'" & txtSearchOnSku.Text & "*'" 
       DataGridView1.DataSource = bs 
       DataGridView1.CurrentCell = DataGridView1.Item(1, currentRowID) 
      End If 
     Catch ex As Exception 
     End Try 
     DataGridView1.FirstDisplayedScrollingRowIndex = scrollPosition 
    End Sub 
End Class 

는 사람이 어떻게 이런 일을 중지하는 말해 줄 수

? 당신을 가정

답변

0

말은, 당신이 ... 당신이 다음 발사하고 필터 해제하기 위해 timer로 싶지 않아, 당신도 할 수

를 결과를 필터링하는 텍스트 상자에 값을 입력 한 경우, 확인하는 것이 Timer1_Tick 루틴에있는 TextBox의 내용.

또는 txtSearchOnSku_TextChanged 루틴에서 타이머를 비활성화 할 수 있습니다.

If txtSearchOnSku.Text <> "" Then 
    Timer1.Stop 
Else 
    Timer1.Start 
End If 

또는 1 초에 한 번씩 검색 결과를 업데이트하려면 검색 기준에 따라 필터링 코드를 Timer1_Tick 루틴에 포함시킬 수 있습니다.

빠른 포인트로서 반복되는 코드가 많이 있습니다. 반복 코드를 다른 하위로 리팩토링하는 것이 가치가있을 수 있습니다.