none
有關資料表的排序問題 RRS feed

  • 問題

  • 我現在在做一個有關資料表排序的問題…
    資料表內容與欄位如下…
    Column1 Comumn2
    1               Test1
    2               Test2
    3               Test3

    現在如果我把第二列與第三列第一個位置的值重新給值變成3和2

    Column1 Comumn2
    1               Test1
    3               Test2
    2               Test3

    因為這個資料表是由直接由DataSet中的表格直接New一個新的表格…

    *我在資料操作上都是在這「New出來的新表格」中動作而以,還沒回存資料庫…

    Q:現在問題是
         我要怎麼做才能讓更改過後的資料表重新排序,能夠讓前端顯示也是經過排序過後的呢…

    而DataTable所提供的Sort僅能排序顯示出來的位置…但在實際表格中的位置還是沒有變動…有什麼方樣可以讓表格中的位置也實際的重新排序過嗎…

    ps.我主要是想做出讓資料有上移下移的動作…
    • 已編輯 justinwu 2009年2月27日 上午 03:41
    2009年2月26日 上午 07:14

解答

  • 小弟不才,只能猜測你是想要做到讓DataGridview上的兩列上下對調,如果是這樣,可以提供一個Code給您參考

    Public Class Form1
        Dim sBindingSource As New BindingSource
        Dim myDataTable As New DataTable

     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
              BuildDGV()
        End Sub


       Private Sub BuildDGV()
           Try
                '這個ReadTable1是一個自訂的Function,執行資料表的查詢,傳回DataTable物件
                myDataTable = ReadTable1()
                sBindingSource.DataSource = myDataTable
                DataGridView1.DataSource = sBindingSource
                sBindingSource.ResetBindings(False)
            Catch ex As Exception
                MessageBox.Show(ex.ToString)
            End Try

        End Sub
        Private Sub BTN_Down_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_Down.Click
            '假設DataGridView的名稱叫DataGridView1
             '這個SUB的內容會讓CurrentRow和下一列對換   
            Dim i As Integer
            Dim iCol As Integer
            iCol = myDataTable.Columns.Count
            If DataGridView1.CurrentRow.Index < DataGridView1.Rows.Count Then
                Dim myCurrentRowItem(iCol - 1) As Object
                Dim myTargetRowItem(iCol - 1) As Object
                myCurrentRowItem = myDataTable.Rows(DataGridView1.CurrentRow.Index).ItemArray
                myTargetRowItem = myDataTable.Rows(DataGridView1.CurrentRow.Index + 1).ItemArray

                For i = 0 To (iCol - 1)
                    myDataTable.Rows(DataGridView1.CurrentRow.Index + 1).Item(i) = myCurrentRowItem(i)

                    myDataTable.Rows(DataGridView1.CurrentRow.Index).Item(i) = myTargetRowItem(i)
                Next

                sBindingSource.ResetBindings(False)
            Else
                MessageBox.Show("已達表格最下方")
            End If
        End Sub

    End Class

    • 已標示為解答 justinwu 2009年3月2日 上午 12:56
    2009年2月27日 上午 09:21
    版主

所有回覆

  •  不太懂你的意思
    你是指要在SQL Server的管理工具看起來有排序嗎?
    那你應該是把Column1設為 index
    然後該調換的是Column2的值
    還一點「欄」指的是Column
    所以「現在如果我把第二欄與第三欄第一個位置的值重新給值變成3和2」應該改成
    「現在如果我把第二列與第三列第一個欄位的值重新給值變成3和2」
    2009年2月27日 上午 12:31
    版主
  • HI,

     

    如果要改變真正的記錄位置, 看來只有靠自己寫程式排序了

    2009年2月27日 上午 02:06
  • 那想請問一下…

    那如果我想寫出在DataGridView上能夠讓資料上移或下移的這樣的動作,而在GridView中顯示的Step一樣會經過排序,而不會有所改變…

    有什麼方法可以達到嗎…

    2009年2月27日 上午 03:39
  • 小弟不才,只能猜測你是想要做到讓DataGridview上的兩列上下對調,如果是這樣,可以提供一個Code給您參考

    Public Class Form1
        Dim sBindingSource As New BindingSource
        Dim myDataTable As New DataTable

     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
              BuildDGV()
        End Sub


       Private Sub BuildDGV()
           Try
                '這個ReadTable1是一個自訂的Function,執行資料表的查詢,傳回DataTable物件
                myDataTable = ReadTable1()
                sBindingSource.DataSource = myDataTable
                DataGridView1.DataSource = sBindingSource
                sBindingSource.ResetBindings(False)
            Catch ex As Exception
                MessageBox.Show(ex.ToString)
            End Try

        End Sub
        Private Sub BTN_Down_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_Down.Click
            '假設DataGridView的名稱叫DataGridView1
             '這個SUB的內容會讓CurrentRow和下一列對換   
            Dim i As Integer
            Dim iCol As Integer
            iCol = myDataTable.Columns.Count
            If DataGridView1.CurrentRow.Index < DataGridView1.Rows.Count Then
                Dim myCurrentRowItem(iCol - 1) As Object
                Dim myTargetRowItem(iCol - 1) As Object
                myCurrentRowItem = myDataTable.Rows(DataGridView1.CurrentRow.Index).ItemArray
                myTargetRowItem = myDataTable.Rows(DataGridView1.CurrentRow.Index + 1).ItemArray

                For i = 0 To (iCol - 1)
                    myDataTable.Rows(DataGridView1.CurrentRow.Index + 1).Item(i) = myCurrentRowItem(i)

                    myDataTable.Rows(DataGridView1.CurrentRow.Index).Item(i) = myTargetRowItem(i)
                Next

                sBindingSource.ResetBindings(False)
            Else
                MessageBox.Show("已達表格最下方")
            End If
        End Sub

    End Class

    • 已標示為解答 justinwu 2009年3月2日 上午 12:56
    2009年2月27日 上午 09:21
    版主
  • 可以從資料結構的書找一些演算法去做,如鏈結串列,可使用陣列、集合來實做,

    如要讓他自動排序,就在事件中做上述的處理。

    2009年2月27日 下午 05:28
  • :::假如使用DataView的Sort方法是不是會比較好???
    然後把DataGridView的資料來源設成DataView !!!
    2009年2月28日 上午 09:38
  • 感謝大家的回答…
    我大概知道要如何解決我的問題了…
    因為當我交換時,我交換的東西是主鍵…
    所以當交換好後,再回存,則就會發生主鍵重覆的問題了
    因為我只要交換時,不要交換主鍵欄位(即"Step"欄位,而交換內容的話,則就不會有問題產生了)
    並且也可以做到上下移動的動作了
    2009年3月2日 上午 12:58