none
[VB2008] DataGridView新增資料列 RRS feed

  • 問題

  • 想請問各位大大
    小弟目前在寫一個小程式
    整個操作步驟如下:
    第一步:選擇Excel檔案,並將檔案內容顯示於DataGridView中。==>這步驟小弟已經搞定了
    第二步:按下"新增資料"的按鍵時,顯示新增資料視窗。==>這步驟小弟也已經OK了
    第三步:在"新增資料"視窗中輸入資料。==>這步驟已經OK了
    第四步:在"新增資料"視窗中按下「輸入完成」按鍵時,將輸入的資料寫入DataGridView中。==>這步驟一直搞不定
    第五步:存回Excel檔

    小弟看了很多前輩的資料
    是利用DataGridViewColumnCollection.Insert 方法
    或者是DataGridViewRowCollection.Insert 方法
    這是小弟很納悶的地方
    一定要組成Collection嗎??
    如果是
    若一列資料有五個欄位(CheckBoxColume,Number.text,Name.text,Phone_Number.text,Address.text)
    小弟要怎麼將資料組成Collection呢?
    若不需要
    那要怎麼把資料寫入呢??

    還請各位大大給小弟一些指點
    謝謝!!

    開發環境:Win XP SP3+Visual Studio 2008(VB)
    2009年3月27日 上午 02:32

解答

  • 風箏:
          你讀取Excel之後有把資料放在DataTable中嗎?
          如果有個話,我個人習慣是會用BindingSource指向DataTable
          然後把DataGridView的DataSource指向該BindingSource
          例如你宣告BindingSource和DataTable
          Dim sBindingSource As New BindingSource
          Dim myDataTable As New DataTable
          可以將將Excel讀入資料放入myDataTable中
          然後執行下列步驟
          sBindingSource.DataSource = myDataTable
          DataGridView1.DataSource = sBindingSource
          sBindingSource.ResetBindings(False)
          此時DataGridView1會Show出你的資料
          當你新增資料時,則使用DataTable的NewRow方法產生一個DataRow物件
          Dim myNewRow As DataRow = myDataTable.NewRow()
          利用DataRow.Item屬性指派各欄的值給myNewRow
          最後用DataRowCollection.Add方法將myNewRow新增到myDataTable中
          後Reset BindingSouce......
          myDataTable.Rows.Add(myNewRow)
          sBindingSource.ResetBindings(False)
          這是我習慣的一種用法
          提供給你參考

    • 已標示為解答 風箏惡魔 2009年3月30日 上午 02:52
    2009年3月27日 上午 04:44
    版主
  • 唉呀!老人家頭昏眼花,真是抱歉,沒發現你是用另一個Form來輸入資料
     Writen_OK_Button_Click 是另外一個Form的事件的話,因為你要從B Form去呼叫A Form的mDT,
    如此 
       Dim MDS As New DataSet
      
    Dim sBS As New BindingSource
      
    Dim mDT As New DataTable
       都要把 Dim 改成 Public

    否則一般Dim會是Private,就無法從外部存取
    然後建議你在輸入資料的Form中我假設它稱為Form2>要確認A Form<我假設它稱為Form1>有無開啟再更動Datatable
    因此在Form2的 Writen_OK_Button_Click 事件
    If Form1.Created
    轉換資料
    將新增的Row指派給Form1.mDT
    Form1.SBS.DataSource=Form1.mDT
    Form1.SBS..ResetBindings(False)
    .....
    用Me.Close(不要用Me.Dispose())

    End if

    • 已標示為解答 風箏惡魔 2009年3月30日 上午 02:52
    2009年3月30日 上午 02:22
    版主
  • 你是用DataRow.Item在新增資料沒錯啊
    假設你有一個輸入的Textbox1
    取得一輸入變數strTXT
    Dim myNewRow As DataRow = myDataTable.NewRow()
    myNewRow.Item(0)=strTXT
    myDataTable.Rows.Add(myNewRow)
    這不就用了DataRow.Item把資料設定給新的一列嗎?
    我的方式關係是 DataGridView <--- BindingSource <--- Datatable
    所以當Datatable改變就執行Bindingsource.ResetBindings,然後DataGridView就改變內容了
    因為你單純改變DataTable並不會讓DataGridview改變,除非DataGridView重新讀取資料
    當然Bindingsource.ResetBindings只是其中一種方法,恰好我喜歡這樣用而已


    • 已標示為解答 風箏惡魔 2009年3月30日 上午 04:23
    2009年3月30日 上午 04:13
    版主
  • Hi,
    離開for迴圈可以用Exit For,離開整個程序用Exit Sub。
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 風箏惡魔 2009年3月31日 下午 12:44
    2009年3月31日 下午 12:39
    版主

所有回覆

  • 風箏:
          你讀取Excel之後有把資料放在DataTable中嗎?
          如果有個話,我個人習慣是會用BindingSource指向DataTable
          然後把DataGridView的DataSource指向該BindingSource
          例如你宣告BindingSource和DataTable
          Dim sBindingSource As New BindingSource
          Dim myDataTable As New DataTable
          可以將將Excel讀入資料放入myDataTable中
          然後執行下列步驟
          sBindingSource.DataSource = myDataTable
          DataGridView1.DataSource = sBindingSource
          sBindingSource.ResetBindings(False)
          此時DataGridView1會Show出你的資料
          當你新增資料時,則使用DataTable的NewRow方法產生一個DataRow物件
          Dim myNewRow As DataRow = myDataTable.NewRow()
          利用DataRow.Item屬性指派各欄的值給myNewRow
          最後用DataRowCollection.Add方法將myNewRow新增到myDataTable中
          後Reset BindingSouce......
          myDataTable.Rows.Add(myNewRow)
          sBindingSource.ResetBindings(False)
          這是我習慣的一種用法
          提供給你參考

    • 已標示為解答 風箏惡魔 2009年3月30日 上午 02:52
    2009年3月27日 上午 04:44
    版主
  • 不是很懂
    以下code是我目前的寫法
        Dim Excel_xls As String 
        Dim Excel_xlsx As String 
        Dim Text_txt As String 
        Dim Open_File As String 
        Dim MyOleDb_cn As New OleDb.OleDbConnection  
        Dim MyOleDb_cmd As New OleDb.OleDbCommand  
        Dim MyData As OleDb.OleDbDataAdapter  
        Dim MDS As New DataSet  
     
    Private Sub OFD_Button_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles OFD_Button.Click  
     
            Excel_xls = "Excel 2000-2003(*.xls)|*.xls" 
            Excel_xlsx = "Excel 2007(*.xlsx)|xlsx" 
     
            OpenDataBase.Filter = Excel_xls & "|" & Excel_xlsx  
            OpenDataBase.FilterIndex = 1  
            OpenDataBase.RestoreDirectory = True 
            OpenDataBase.InitialDirectory = "C:\" 
     
            If OpenDataBase.ShowDialog() = DialogResult.OK Then 
                Open_File = OpenDataBase.FileName  
            End If 
     
            MyOleDb_cn = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;" & "Data Source=" & Open_File & ";" & "Extended Properties=Excel 12.0")  
            MyOleDb_cmd = New OleDb.OleDbCommand("Select * from [sheet1$]", MyOleDb_cn)  
            MyData = New OleDb.OleDbDataAdapter(MyOleDb_cmd)  
            MyData.Fill(MDS)  
            DataView.DataSource = MDS.Tables(0).DefaultView  
     
        End Sub 
    剛剛嘗試了一下大大您說的方法
    code改寫如下:
        Private Sub OFD_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OFD_Button.Click  
     
            Excel_xls = "Excel 2000-2003(*.xls)|*.xls" 
            Excel_xlsx = "Excel 2007(*.xlsx)|xlsx" 
     
            OpenDataBase.Filter = Excel_xls & "|" & Excel_xlsx  
            OpenDataBase.FilterIndex = 1 
            OpenDataBase.RestoreDirectory = True 
            OpenDataBase.InitialDirectory = "C:\" 
     
            If OpenDataBase.ShowDialog() = DialogResult.OK Then  
                Open_File = OpenDataBase.FileName  
            End If  
     
            MyOleDb_cn = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;" & "Data Source=" & Open_File & ";" & "Extended Properties=Excel 12.0")  
            MyOleDb_cmd = New OleDb.OleDbCommand("Select * from [sheet1$]", MyOleDb_cn)  
            MyData = New OleDb.OleDbDataAdapter(MyOleDb_cmd)  
            MyData.Fill(MDT)  
            SBS.DataSource = MDT 
            DataView.DataSource = SBS 
            SBS.ResetBindings(False)  
     
        End Sub 
    但會在「SBS.DataSource = MDT 」這一行出現「其他資訊: 並未將物件參考設定為物件的執行個體」的例外
    是那邊寫錯了呢??
    還請大大指點...
    感恩...
    2009年3月27日 上午 06:21
  • 你宣告SBS的時候,有使用New產生執行個體嗎?
    因為上面的Code沒看到你如何宣告的..
    看起來MDT是Dataset吧?
    你改成SBS.DataSource = MDT.Tables(0) 看看 

    2009年3月27日 上午 08:52
    版主
  • 要new 一下
    崔偉 如果對我有疑問請發郵件謝謝~~!! cuiweitw@gmail.com
    2009年3月29日 下午 03:08
  • 風箏:
          還有遇到哪些問題嗎?
          我忘了提醒你,BindingSource和DataTable最好宣告在Class層級
          也就是不要宣告在底下的Sub或Function裡
          而且記得用 New關鍵字產生執行個體
         
    2009年3月29日 下午 04:44
    版主
  • 先感謝Bill大大的協助
    目前小弟測試出來是可以依照大大的方式將Excel檔案的資料顯示在DataGridView中
    但...
    在新增資料時卻發生了一個現象
    就是無法呼叫主視窗的變數...

    Public Class SongManager
        Dim Excel_xls As String
        Dim Excel_xlsx As String
        Dim Text_txt As String
        Dim Open_File As String
        Dim MyOleDb_cn As New OleDb.OleDbConnection
        Dim MyOleDb_cmd As New OleDb.OleDbCommand
        Dim MyData As OleDb.OleDbDataAdapter
        Dim MDS As New DataSet
        Dim sBS As New BindingSource
        Dim mDT As New DataTable
    
    
        Private Sub OFD_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OFD_Button.Click
            Excel_xls = "Excel 2000-2003(*.xls)|*.xls"
            Excel_xlsx = "Excel 2007(*.xlsx)|xlsx"
            OpenDataBase.Filter = Excel_xls & "|" & Excel_xlsx
            OpenDataBase.FilterIndex = 1
            OpenDataBase.RestoreDirectory = True
            OpenDataBase.InitialDirectory = "C:\"
    If OpenDataBase.ShowDialog() = DialogResult.OK Then Open_File = OpenDataBase.FileName End If
    MyOleDb_cn = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OleDb.12.0;" & "Data Source=" & Open_File & ";" & "Extended Properties=Excel 12.0") MyOleDb_cmd = New OleDb.OleDbCommand("Select * from [sheet1$]", MyOleDb_cn) MyData = New OleDb.OleDbDataAdapter(MyOleDb_cmd) MyData.Fill(mDT) sBS.DataSource = mDT DataView.DataSource = sBS sBS.ResetBindings(False) 'DataView.DataSource = MDS.Tables(0).DefaultView End Sub
        Private Sub Writen_OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Writen_OK_Button.Click
            Me.Dispose()
        End Sub
    
    


    第一段程式是宣告變數的部分
    可以確定的是...我把sBS and mDT都放在Class下
    而非放在其他程式碼區塊下
    第二段程式是主視窗中開啟Excel檔案的程式
    第三段程式是小弟在主視窗中按下「新增資料」按鍵時
    會出現子視窗讓使用者輸入資料
    當按下「輸入確認」時
    會直接將資料寫入DataGridView中
    但在第三段程式中
    卻一直無法呼叫主程式中的mDT...
    會出現..."無法在此內容中存取mDT,因為它是Private"
    這是啥問題勒
    明明把mDT放在Class下啊
    • 已編輯 bauannModerator 2009年3月30日 上午 02:14 程式碼去除多餘空白部分
    2009年3月30日 上午 01:49
  • 唉呀!老人家頭昏眼花,真是抱歉,沒發現你是用另一個Form來輸入資料
     Writen_OK_Button_Click 是另外一個Form的事件的話,因為你要從B Form去呼叫A Form的mDT,
    如此 
       Dim MDS As New DataSet
      
    Dim sBS As New BindingSource
      
    Dim mDT As New DataTable
       都要把 Dim 改成 Public

    否則一般Dim會是Private,就無法從外部存取
    然後建議你在輸入資料的Form中我假設它稱為Form2>要確認A Form<我假設它稱為Form1>有無開啟再更動Datatable
    因此在Form2的 Writen_OK_Button_Click 事件
    If Form1.Created
    轉換資料
    將新增的Row指派給Form1.mDT
    Form1.SBS.DataSource=Form1.mDT
    Form1.SBS..ResetBindings(False)
    .....
    用Me.Close(不要用Me.Dispose())

    End if

    • 已標示為解答 風箏惡魔 2009年3月30日 上午 02:52
    2009年3月30日 上午 02:22
    版主
  • Bill大大
    別這麼說
    您肯抽空協助小弟就感激不盡了...
    不過這邊還是很疑惑
    現在正在看MSDN...
    關於DatarOW.Item
    實在是看不懂要怎麼把輸入的資料透過DataRow.Item寫入DataGridView中...
    不是取得就是設定...
    感覺都好像是把欄位裡面的資料讀出來...(努力研究ing)
    2009年3月30日 上午 02:51
  • 其實是因為有作一個Bindingsource.ResetBindings的動作
    這個方法會告知繫結到此一BindingSource的控制項重新整理它的值
    在你的例子中就是一個DataGridView控制項
    所以當執行Bindingsource.ResetBindings執行時就會告知DataGridView重讀一次資料
    所以就改變囉
    2009年3月30日 上午 03:12
    版主
  • 但在MSDN中
    針對DataRow.Item的敘述

      Item[([(DataColumn])]) 取得或設定儲存於指定的 DataColumn 中的資料。
       Item[([(Int32])]) 取得或設定儲存於索引指定的資料行中的資料。
      Item[([(String])]) 取得或設定儲存於名稱所指定之資料行的資料。
       Item[([(DataColumn, DataRowVersion])]) 取得儲存於指定的 DataColumn 中指定版本的資料。
       Item[([(Int32, DataRowVersion])]) 取得儲存於資料行中的資料,它是由要擷取的資料索引和版本所指定。
       Item[([(String, DataRowVersion])]) 取得儲存於具名資料行中指定版本的資料。


    若我要新增資料
    勢必無法利用DataRow.Item了
    2009年3月30日 上午 03:41
  • 你是用DataRow.Item在新增資料沒錯啊
    假設你有一個輸入的Textbox1
    取得一輸入變數strTXT
    Dim myNewRow As DataRow = myDataTable.NewRow()
    myNewRow.Item(0)=strTXT
    myDataTable.Rows.Add(myNewRow)
    這不就用了DataRow.Item把資料設定給新的一列嗎?
    我的方式關係是 DataGridView <--- BindingSource <--- Datatable
    所以當Datatable改變就執行Bindingsource.ResetBindings,然後DataGridView就改變內容了
    因為你單純改變DataTable並不會讓DataGridview改變,除非DataGridView重新讀取資料
    當然Bindingsource.ResetBindings只是其中一種方法,恰好我喜歡這樣用而已


    • 已標示為解答 風箏惡魔 2009年3月30日 上午 04:23
    2009年3月30日 上午 04:13
    版主
  • 瞭解了
    感謝Bill大大詳細的解釋
    小弟來去試試看...
    感恩

    經過Bill大大的解說
    然後很努力的測試之後
    終於搞定了...

    但小弟還有一個問題...
    若在資料欄位第一欄為編號(手動輸入)
    我要如何取出中間跳號的部分呢??
    Ex:編號  1245  1246  1249  1250  1255
    則要取出   1247  1248  1251  1252  1253 1254
    2009年3月30日 上午 04:24
  • 風箏:
          這種我只會用阿呆方法作ㄟ
          就先使用Datatable.Compute取得Min和Max的值
         iMax= mDT.Compute("Max(編號)")
         iMin =  mDT.Compute("Min(編號)")
         Dim xRow() As DataRow
         '然後用迴圈比對
         For i= (iMin+1) to (iMax-1)  <==因為iMin和iMax一定有就不用比了
            xRow=DataTable.Select("編號=" & i )      <==用Datatable.Select來過濾
            if xRow.Length <=0 Then     <==如果xRow陣列的元素數量小於等於0,表示i是沒有的 <其實應該沒機會小於0啦>
                Messagebox.Show( Cstr(i) & ":不存在")
            End if
         Next
    2009年3月30日 上午 08:01
    版主
  • Bill大大
    小弟依您給的方向去寫出一段程式
    code如下:
        Private Sub System_Default_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles System_Default_Button.Click

            Dim sCounter As Integer
            Dim xRow As DataRow

            For sCounter = 1001 To 65536
                xRow = SongManager.mDT.Select("編號=" & sCounter)
            Next

        End Sub

    但在xRow = SongManager.mDT.Select("編號=" & sCounter)這個部分
    出現"型別1-維陣列屬於System.Data.DataRow的值無法轉成System.Data.DataRow"
    所以小弟將xRow = SongManager.mDT.Select("編號=" & sCounter)改寫成
    xRow(sCounter-1001) = SongManager.mDT.Select("編號=" & sCounter)
    但在xRow出現"變數xRow已在指派值之前使用。可能會在執行階段產生null參考例外狀況"
    執行後出現"類型 'System.NullReferenceException' 的未處理例外狀況發生於 管理程式.exe""其他資訊: 並未將物件參考設定為物件的執行個體"
    這...

    2009年3月31日 上午 01:28
  • Dim xRow as DataRow <==這樣不行,要設成陣列喔,因為DataTable.Select傳回的是DataRowCollection,也就是陣列集合
    所以是 Dim xRow() as DataRow
    2009年3月31日 上午 01:37
    版主
  • But...
    "型別1-維陣列屬於System.Data.DataRow的值無法轉成System.Data.DataRow"
    這個錯誤訊息一直存在捏...
    如果把xRow(sCounter-1001) = SongManager.mDT.Select("編號=" & sCounter)這行改寫成
    xRow = SongManager.mDT.Select("編號=" & sCounter)
    那麼錯誤訊息就會消失
    但...
    Song_Number.Text = Str(xRow(0))的xRow(0)又會出現"變數xRow已在指派值之前使用。可能會在執行階段產生null參考例外狀況"
    現在是怎樣勒
    一直出現這兩個訊息...

    2009年3月31日 上午 01:42
  • 風箏:
          你可以把目前的這一段程式貼出來嗎?我想應該是要加上條件式
    2009年3月31日 上午 02:10
    版主
  • 以下是目前我寫成這樣:

        Private Sub System_Default_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles System_Default_Button.Click
    
            Dim sCounter As Integer
            Dim xRow() As DataRow
    
            For sCounter = 1001 To 65536
                xRow(sCounter - 1001) = SongManager.mDT.Select("編號=" & sCounter)
            Next
    
            Song_Number.Text = Str(xRow(0))
    
        End Sub
    一直在思考為啥會這樣...
    2009年3月31日 上午 02:13
  •  xRow(sCounter - 1001) = SongManager.mDT.Select("編號=" & sCounter) <==這一行就怪了
    當宣告XRow陣列的時候,我們並沒有辦法知到它們的大小
    因為天曉得用Datatable.Select會選出多少列
    這邊應該是你誤解了,這個xRow事實上是SongManager.mDT.Select("編號=" & sCounter)的結果
    也就是每當迴圈跑一次(也就是sCounter +1),xRow的內容就會被徹底改變一次
    用個實際的例子你可能會比較瞭解,假設你所有的編號都是唯一的
    迴圈內的敘述改成這樣
    XRow=SongManager.mDT.Select("編號=" & sCounter)
    當sCounter=1001時,如果mDT內有這筆資料
    此時xRow(0)的值就等於1001 ,而且陣列內不會產生其它的元素,也就是這個陣列只有一個元素
    當sCounter=1002,而mDT內沒有這個資料
    那xRow is Nothing,也就是xRow陣列是完全沒有任何元素的
    當sCounter=1003,,如果mDT內有這筆資料
    此時xRow(0)的值就等於1003 ,而且陣列內不會產生其它的元素,也就是這個陣列只有一個元素
    ...以此類推
    因此你的程式應該改成
          Dim xRow() As DataRow

            For sCounter = 1001 To 65536
                xRow= SongManager.mDT.Select("編號=" & sCounter)
                If xRow.Length >0 Then
                     Song_Number.Text = Str(xRow(0))
                End If
            Next

    2009年3月31日 上午 02:29
    版主
  • 剛剛依大大您的建議修改了一下code
    但...
    在Song_Number.Text = Str(xRow(0))
    出現了"類型 'System.InvalidCastException' 的未處理例外狀況發生於 Microsoft.VisualBasic.dll"及"其他資訊: 無法將引數 'Number' 轉換為數字的值。"
    也嘗試過去調整判斷的部分或Str轉型的參數部分
    都無法正確判斷出來捏...

    2009年3月31日 上午 02:47
  • 唉呀,忽略了一個重要的事情,我果然腦子不靈光了
    因為xRow是個DataRow..
    要取值應該是XRow(0).Item(0)

    2009年3月31日 上午 03:30
    版主
  • Bill大
    別這麼說
    您肯抽空解答小弟的問題就很棒了

    剛剛試了一下
    會抓到60566
    而剛好這個數字是整個資料的最後一筆(有使用的)
    但在中間有斷號(例如:51781到60000都沒用)
    我一直沒法抓出這段跳號的數字出來使用
    是哪邊有問題嗎??
    另外
    iMax= mDT.Compute("Max(編號)")
    iMin =  mDT.Compute("Min(編號)")
    這兩行我一直無法執行
    所以才會直接寫入數值(1001~65536)
    2009年3月31日 上午 03:40
  •        在迴圈內使用DataTable.Select抓不到值時,xRow會沒有元素
           所以此時xRow.Length會等於0,就表示在mDT找不到sCounter的值
             If xRow.Length >0 Then
                     Song_Number.Text = Str(xRow(0))
             Else
                     '這邊就看你如果找不到這個值要怎麼處理 sCounter囉,也許可以加到另一個TextBox中
                     'for example
                     TextBox2.Text &= CSTR(sCounter)  & ","
              End If
    至於
    iMax= mDT.Compute("Max(編號)")
    iMin =  mDT.Compute("Min(編號)")
    為何會不能跑?
    因為我又打太快了<我怎老搞這種飛機!?>
    應該是
    iMax=  SongManager.mDT.Compute("Max(編號)","")
    iMin =   SongManager.mDT.Compute("Min(編號)","")



         
    2009年3月31日 上午 03:59
    版主
  • 抱歉,借用篇幅

    To Bill
    這篇不知道你有沒有看到,去看一下,提供一下你的相關資料給Moli老大
    http://social.msdn.microsoft.com/Forums/zh-TW/243/thread/57418cf8-c5e5-4a6e-a81e-2fee333f3622
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年3月31日 上午 04:57
    版主
  • 大大
    想請問一下

        Private Sub System_Default_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles System_Default_Button.Click
            Dim xRow() As DataRow

            For sCounter = 1001 To 65536
                xRow = SongManager.mDT.Select("歌曲編號=" & sCounter)
                If xRow.Length > 0 Then
                    Song_Number.Text = CStr(sCounter)
                    xxxxxxxx<=中斷點
                End If
            Next

        End Sub

    小弟想要在抓到缺少的序號後
    脫離if迴圈
    該用何種指令呢??
    好像不能用Break(用的語言太多,忘了VB了...)

    2009年3月31日 下午 12:13
  • Hi,
    離開for迴圈可以用Exit For,離開整個程序用Exit Sub。
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    • 已標示為解答 風箏惡魔 2009年3月31日 下午 12:44
    2009年3月31日 下午 12:39
    版主
  • 感謝樓上大大的回答
    小弟將code寫成這樣就OK了

        Private Sub System_Default_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles System_Default_Button.Click
            Dim xRow() As DataRow

            For sCounter = 1001 To 65536
                xRow = SongManager.mDT.Select("歌曲編號=" & sCounter)
                If xRow.Length <= 0 Then
                    Song_Number.Text = CStr(sCounter)
                    Exit For
                End If
            Next

        End Sub

    2009年3月31日 下午 12:45