none
在DataGridView內搜詢記錄的問題 RRS feed

  • 問題

  • 我的問題描述如下:

     

    1.假設 DataGridView 含有「科系、班級、年級、姓名....」等等欄位。

    2.有什麼方法可搜尋出符合「科系、班級、年級」的記錄,但不會改變 DataGridView 的目前選取列

    3.若使用BindingSource.Filter方法,將會改變 DataGridView 的目前選取列,因此不考慮用它。

    4.使用BindingSource.Find方法,只能找出符合單一欄位值的記錄,若它能搜尋出同時符合「科系、班級、年級」欄位值的記錄,則此方法就是我所要的。

    5.如何使用程式碼,改變 DataGridView 目前選取列的位置,例如將選取列移到第 10 列處。

     

    敬請指導,謝謝。

    2008年1月24日 上午 01:51

解答

  • Hi,

    DataTable.Rows.Find方法是根據主索引找出完全相符的資料,而DataTable.Select方法則可以自己去下條件,傳回結果的型態也不同;要同時多個條件的話你也可以用AND去連接,例如

           

    Code Snippet
    Dim DR() As DataRow
    DR = Me.DataSet.myTable.Select("pName='王小明' AND pPhone='12345678'")
    MessageBox.Show(DR.Length)

     

    如何指定DataGirdView目前的選取列可以參考下面程式碼,我是利用BindingSource.Find去尋找資料,如果你是用Select的方式找出多個資料列,那麼要提取其中一列的唯一索引值之後再利用BindingSource的Find去找

           

    Code Snippet
    Dim x As Integer = 0
    Select Case cboSerch.SelectedIndex
        Case Is = 0
            x = myBindingSource.Find("pID", txtSerch.Text)
        Case Is = 1
            x = BS_F101.Find("pID", txtSerch.Text)
        Case Is = 2
            x = myBindingSource.Find("pID", txtSerch.Text)
    End Select
    If x >= 0 Then
        myBindingSource.Position = x
        myDataGridView.Rows(x).Selected = True
        myDataGridView.FirstDisplayedScrollingRowIndex = x
    End If

     

     

    相關參考

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.cht/CPref17/html/T_System_Windows_Forms_BindingSource_Methods.htm

    2008年1月24日 下午 03:26
    版主
  • Hi,

    DataTable.Select找出來的DataRow()是參考到DataSet裡面,你可以直接利用它去修改、更新,可以參考下面程式碼

    Code Snippet

    Dim DR() As DataRow
    DR = Me.myDataSet.myDataTable.Select("pName='王小明'")
    If DR.Length > 0 Then
        For i As Integer = 0 To DR.Length - 1
            If CStr(DR(i).Item("pName")) = "王小明" Then
                DR(i).Item("pName") = "王大明"
            End If
        Next

    End If
    Me.BingingSource.EndEdit()
    Me.myDataTableTableAdapter.Update(DR)
    Me.myDataSet.myDataTable.AcceptChanges()

     

     

    新增的部分配合BindingNavigator來做會比較簡單,設定好資料來源就可以了,如果你要從程式裡面做的話可以參考下面

    Code Snippet

    Dim newDR As DataRow = Me.myDataSet.myDataTable.NewRow
    newDR.Item("pID") = "12312312"
    newDR.Item("pPhone") = "www"
    newDR.Item("pName") = "新資料列"
    Me.myDataSet.myDataTable.AddmyDataTableRow(newDR)

     

     

    2008年1月25日 上午 02:59
    版主

所有回覆

  • 如果您的BindingSource的來源是DATASET或 DATATABLE

    您可以直接對DATASET或 DATATABLE作搜尋

    就可取得您要的資料
    2008年1月24日 上午 03:21
  • 1.感謝指導,但我會的僅是前述的 find 與 Filter 兩種搜尋方法,但它沒辦法滿足我的使用須求。

    2.敬請再指導,謝謝。

    2008年1月24日 上午 03:27
  •  

    DataTable.Select 方法 (String, String)

    http://msdn2.microsoft.com/zh-tw/library/way3dy9w(vs.80).aspx

    2008年1月24日 上午 03:32
  • 1.感謝指導。

    2.如果是要同時找出符合條件1、條件2、條件3..的記錄,然後取出其內的值,而於運算後填回新值,這該怎麼作。

    3.例如要找出「資工系,1 年 3班」的學生,然後將其 1 年級取出,加 1,變成 2 之後填回,使轉為 2 年級。在配合DataGridView使用下,該如何搜尋記錄與更新記錄。

    4.請問如何使用程式碼,改變 DataGridView 目前選取列的位置,例如將選取列移到第 10 列處。

     

    敬請再指導,謝謝。

    2008年1月24日 上午 05:33
  • Hi,

    DataTable.Rows.Find方法是根據主索引找出完全相符的資料,而DataTable.Select方法則可以自己去下條件,傳回結果的型態也不同;要同時多個條件的話你也可以用AND去連接,例如

           

    Code Snippet
    Dim DR() As DataRow
    DR = Me.DataSet.myTable.Select("pName='王小明' AND pPhone='12345678'")
    MessageBox.Show(DR.Length)

     

    如何指定DataGirdView目前的選取列可以參考下面程式碼,我是利用BindingSource.Find去尋找資料,如果你是用Select的方式找出多個資料列,那麼要提取其中一列的唯一索引值之後再利用BindingSource的Find去找

           

    Code Snippet
    Dim x As Integer = 0
    Select Case cboSerch.SelectedIndex
        Case Is = 0
            x = myBindingSource.Find("pID", txtSerch.Text)
        Case Is = 1
            x = BS_F101.Find("pID", txtSerch.Text)
        Case Is = 2
            x = myBindingSource.Find("pID", txtSerch.Text)
    End Select
    If x >= 0 Then
        myBindingSource.Position = x
        myDataGridView.Rows(x).Selected = True
        myDataGridView.FirstDisplayedScrollingRowIndex = x
    End If

     

     

    相關參考

    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.cht/CPref17/html/T_System_Windows_Forms_BindingSource_Methods.htm

    2008年1月24日 下午 03:26
    版主
  • 1.感謝前輩們的指導。尤特別感謝 bauann 指導,每回您都能直擊問題核心,佩服。

    2.再請問:由於 myTable.Select 的傳回值是陣列值,主要功能是取得列資料。而我的需求是透過多條件找出記錄,然後更新記錄值,因此須要傳回的是記錄的列索引,以便能取出儲存格資料,然後在更新資料後再給於存回。而myTable.Select 無法傳回列索引,因此該如何更改資料呢?

    3.DataGridView如果繫結了資料源,就無法使用程式碼加入新資料列,若要加入新資料列該怎麼作呢?

     

    敬請再次指導。

    2008年1月25日 上午 01:18
  • 在gridview內可以這樣做啦 不知道DataGridView 是否也可以

     Protected Sub GridView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.DataBound
            Dim x As Integer
            For x = 0 To Me.GridView1.Rows.Count - 1
                If Me.GridView1.Rows(x).Cells(0).Text = "科系值" And _
                Me.GridView1.Rows(x).Cells(1).Text = "班級值" And _
                Me.GridView1.Rows(x).Cells(2).Text = "年級值" And _
                Me.GridView1.Rows(x).Cells(3).Text = "年級值" Then
                    Me.GridView1.SelectedIndex = x

                    'Me.GridView1.SelectedRow.BackColor = Drawing.Color.Red

                    '過年快到了 來點紅色吧~!!
                End If
            Next
        End Sub

    2008年1月25日 上午 01:23
  • Hi,

    DataTable.Select找出來的DataRow()是參考到DataSet裡面,你可以直接利用它去修改、更新,可以參考下面程式碼

    Code Snippet

    Dim DR() As DataRow
    DR = Me.myDataSet.myDataTable.Select("pName='王小明'")
    If DR.Length > 0 Then
        For i As Integer = 0 To DR.Length - 1
            If CStr(DR(i).Item("pName")) = "王小明" Then
                DR(i).Item("pName") = "王大明"
            End If
        Next

    End If
    Me.BingingSource.EndEdit()
    Me.myDataTableTableAdapter.Update(DR)
    Me.myDataSet.myDataTable.AcceptChanges()

     

     

    新增的部分配合BindingNavigator來做會比較簡單,設定好資料來源就可以了,如果你要從程式裡面做的話可以參考下面

    Code Snippet

    Dim newDR As DataRow = Me.myDataSet.myDataTable.NewRow
    newDR.Item("pID") = "12312312"
    newDR.Item("pPhone") = "www"
    newDR.Item("pName") = "新資料列"
    Me.myDataSet.myDataTable.AddmyDataTableRow(newDR)

     

     

    2008年1月25日 上午 02:59
    版主
  • 感謝再次指導,預祝新年快樂。

     

    謝了。

    2008年1月25日 上午 03:41
  • 1.感謝指導。

    2.不知出了什麼狀況,我應用下列前輩的例子試了又試,但DR.Length的傳回值一直是0,表示找不到資料。

    Dim DR() As DataRow
    DR = Me.DataSet.myTable.Select("pName='王小明' AND pPhone='12345678'")
    MessageBox.Show(DR.Length)

     

    我的程式碼:

       Dim DR() As DataRow
       DR = Me.DataSet.個人資料.Select("學號='xxx' AND 姓名='xxxxx'")
       MessageBox.Show(DR.Length)

     

    3.我的DataSet內含有學號、姓名、班級、年級等等欄位。

     

    敬請前輩再指導,或是提供簡例讓我測試。感激啦。

    2008年1月25日 上午 07:24
  • Hi,

    你可以先確認一下"個人資料"這個資料表裡面有沒有資料也就是去看DataTable.Rows.Count,確定有資料之後先Select其中一個條件,比如說先找 學號='xxx'  看看有沒有結果,一步一步去查看看。

     

    2008年1月25日 下午 01:07
    版主
  • 感謝指導,問題已解決。

     

    再謝。

    2008年1月25日 下午 02:51