none
Datagridview 問題 RRS feed

  • 問題

  • 請問有沒有方法可以很簡單清空Datagridview內的全部資料?
    因為那Datagridview還要不斷再使用檢顯示不同的資料表,所以不可以Dispose。
    2009年2月21日 下午 11:59

解答

  • HI,

    您可以這樣做:
    DataGridView物件.DataSource = Nothing

    tihs
    2009年2月22日 上午 12:54
  • 用Bindignsource可以的,我試過了,就算是讀兩個不同的資料表都行
    假設畫面上有個DataGridView的物件叫DataGridView1
    Public Class Form1

       Dim sBindingSource As New BindingSource
       Dim myDataTable As New DataTable
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                  myDataTable.Clear()
                'ReadDB1是我寫的另一個函式用來讀取第一個資料表,傳回Datatable物件
                myDataTable = ReadDB1()
                sBindingSource.DataSource = myDataTable
                DataGridView1.DataSource = sBindingSource
                sBindingSource.ResetBindings(False)
      End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
                  myDataTable.Clear()
                'ReadDB2是我寫的另一個函式用來讀取第二個資料表,傳回Datatable物件
                myDataTable = ReadDB2()
                sBindingSource.DataSource = myDataTable
                DataGridView1.DataSource = sBindingSource
                sBindingSource.ResetBindings(False)
      End Sub


    End Class

    我這樣寫就行的通....
    我這樣寫的意思是,不要把DataGridView的Datasource直接指向Datatable,要先把BindingSource物件的DataSource指向Datatable,然後再將DataGridView的DataSource指向BindingSource.
    這樣做有很多好處
    2009年2月23日 上午 06:41
    版主

所有回覆

  • HI,

    您可以這樣做:
    DataGridView物件.DataSource = Nothing

    tihs
    2009年2月22日 上午 12:54
  • 多謝!
    但我已經試過這方法,但結果是上一筆資料還是顯示在DataGridView內,而新的資料就顯示在上一筆以下的地方。
    2009年2月22日 上午 10:13
  • S.K.Andy 表示:

    多謝!
    但我已經試過這方法,但結果是上一筆資料還是顯示在DataGridView內,而新的資料就顯示在上一筆以下的地方。



    DataSource都Nothing了,怎麼可能還有資料~~

    上一筆,下一筆是什麼意思,是要清除一列的資料而嗎??
    2009年2月22日 上午 10:43
  • 不單是清除一列的資料。
    事關是要分別顯示兩個資料表,當顯示第一個資料表時,內裡的三筆資料都顯示正常,但當要顯示第二個資料表時(內裡有五筆資料)出現問題,會變成顯示八筆資料,所以我就想在顯示第二個資料表前,先清空DataGridView內的全部資料,但一直都無法成功。
    2009年2月22日 上午 10:48
  • DataGridView.Rows.Clear( )

    是這個吧~~
    2009年2月22日 下午 01:47
  • 都不是太可行,會出錯誤…
    2009年2月22日 下午 02:14
  • 資料是怎麼繫結的?請貼出處理資料來源以及跟DataGridview相關的程式碼吧。
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年2月22日 下午 05:24
    版主
  • 我習慣都會用BindingSource當DataTable和DataGridView的中介啦
    例如像這樣
     Dim sBSource As New BindingSource
     Dim myDataTable As DataTable
     
    Private Sub BuildDataGridView
          ' 這邊是建立DataGridView的顯示資料
          myDataTable = M_Con.ReadTBController()
          sBSource.DataSource = myDataTable
          DataGridView1.DataSource = sBindingSource
          sBSource.ResetBindings(False)
    End Sub

    Private Sub ClearDataGridView
           '這邊是清除DataGridview的資料
             myDataTable.Rows.Clear()
             sBSource..ResetBindings(False)
    End Sub

    2009年2月23日 上午 01:20
    版主
  • 我的情況比較複雜,因為變數多。
    我是大致這樣的:

        Const connectionstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SellDay.mdb;"

        Dim oledbconnection As New OleDbConnection(connectionstring)

        Dim queryofgrid As String = "SELECT TBK_Number, Absent, Remarks FROM SellDay WHERE Date = ?"
        Dim oledbcommandofgrid As New OleDbCommand(queryofgrid, OleDbConnection)
        Dim dataadapterofgrid As New OleDbDataAdapter(oledbcommandofgrid)
        Dim datasetofgrid As New DataSet()

    以上是Read Database前的設定。
    以下是Read Database,編寫於兩個Button內。
         oledbcommandofgrid.Parameters.Clear()
         dgvSellDayView.DataSource = Nothing
         oledbcommandofgrid.Parameters.Add("@Date", OleDbType.Date).Value = CDate(txtSellDay.Text)
         dataadapterofgrid.Fill(datasetofgrid, "SellDay")
         dgvSellDayView.DataSource = datasetofgrid.Tables("SellDay")

    顯示第一個資料表時是沒有問題的,但再想單獨第二個資料表時,DatagridView會同時顯示兩個資料表。
    曾加入dgvSellDayView.Rows.clear(),但結果都是一樣。


    2009年2月23日 上午 06:11
  • 用Bindignsource可以的,我試過了,就算是讀兩個不同的資料表都行
    假設畫面上有個DataGridView的物件叫DataGridView1
    Public Class Form1

       Dim sBindingSource As New BindingSource
       Dim myDataTable As New DataTable
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                  myDataTable.Clear()
                'ReadDB1是我寫的另一個函式用來讀取第一個資料表,傳回Datatable物件
                myDataTable = ReadDB1()
                sBindingSource.DataSource = myDataTable
                DataGridView1.DataSource = sBindingSource
                sBindingSource.ResetBindings(False)
      End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
                  myDataTable.Clear()
                'ReadDB2是我寫的另一個函式用來讀取第二個資料表,傳回Datatable物件
                myDataTable = ReadDB2()
                sBindingSource.DataSource = myDataTable
                DataGridView1.DataSource = sBindingSource
                sBindingSource.ResetBindings(False)
      End Sub


    End Class

    我這樣寫就行的通....
    我這樣寫的意思是,不要把DataGridView的Datasource直接指向Datatable,要先把BindingSource物件的DataSource指向Datatable,然後再將DataGridView的DataSource指向BindingSource.
    這樣做有很多好處
    2009年2月23日 上午 06:41
    版主
  • 我試了一下 不用清空吧! 切換粉正常呀 不會有你說的情況耶

    class Class1
        {
            public DataSet rds(string strsql)
            {
                DataSet returnds = new DataSet();
                string strconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.mdb;User Id=admin;Password=;";
                OleDbConnection objconn = new OleDbConnection(strconn);
                OleDbDataAdapter objadt = new OleDbDataAdapter(strsql, objconn);
                objadt.Fill(returnds);
                return returnds;
            }
        }
    兩個button

     private void button1_Click(object sender, EventArgs e)
            { 
                Class1 c1 =new Class1();
               dataGridView1.DataSource= c1.rds("select * from web").Tables[0];
               dataGridView1.Columns[0].HeaderText = "編號";
               dataGridView1.Columns[1].HeaderText = "廠商";
               dataGridView1.Columns[2].HeaderText = "描述";
               dataGridView1.Columns[3].HeaderText = "路徑";         
            }
     private void button2_Click(object sender, EventArgs e)
            {
                Class1 c1 = new Class1();
                dataGridView1.DataSource = c1.rds("select * from userdata").Tables[0];
                dataGridView1.Columns[0].HeaderText = "編號";
                dataGridView1.Columns[1].HeaderText = "姓名";
                dataGridView1.Columns[2].HeaderText = "身份證字號";
            }

    2009年2月24日 上午 03:06
  • S.K.Andy 表示:

    我的情況比較複雜,因為變數多。
    我是大致這樣的:

        Const connectionstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SellDay.mdb;"

        Dim oledbconnection As New OleDbConnection(connectionstring)

        Dim queryofgrid As String = "SELECT TBK_Number, Absent, Remarks FROM SellDay WHERE Date = ?"
        Dim oledbcommandofgrid As New OleDbCommand(queryofgrid, OleDbConnection)
        Dim dataadapterofgrid As New OleDbDataAdapter(oledbcommandofgrid)
        Dim datasetofgrid As New DataSet()

    以上是Read Database前的設定。
    以下是Read Database,編寫於兩個Button內。
         oledbcommandofgrid.Parameters.Clear()
         dgvSellDayView.DataSource = Nothing
         oledbcommandofgrid.Parameters.Add("@Date", OleDbType.Date).Value = CDate(txtSellDay.Text)
         dataadapterofgrid.Fill(datasetofgrid, "SellDay")
         dgvSellDayView.DataSource = datasetofgrid.Tables("SellDay")

    顯示第一個資料表時是沒有問題的,但再想單獨第二個資料表時,DatagridView會同時顯示兩個資料表。
    曾加入dgvSellDayView.Rows.clear(),但結果都是一樣。




    DataGridView資料繫結完成之後就會反映出DataTable裡面的資料,假如你是把資料Fill到同一個DataTable裡面(沒有更動過Datagridview的DataSource、DataMember等設定),那麼,在做Fill的動作之前必須要手動的將DataTable裡面的資料清空,不然就會有殘存的資料。
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/
    2009年2月24日 上午 03:38
    版主
  • Bill Chung 表示:

    用Bindignsource可以的,我試過了,就算是讀兩個不同的資料表都行
    假設畫面上有個DataGridView的物件叫DataGridView1
    Public Class Form1

       Dim sBindingSource As New BindingSource
       Dim myDataTable As New DataTable
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                  myDataTable.Clear()
                'ReadDB1是我寫的另一個函式用來讀取第一個資料表,傳回Datatable物件
                myDataTable = ReadDB1()
                sBindingSource.DataSource = myDataTable
                DataGridView1.DataSource = sBindingSource
                sBindingSource.ResetBindings(False)
      End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
                  myDataTable.Clear()
                'ReadDB2是我寫的另一個函式用來讀取第二個資料表,傳回Datatable物件
                myDataTable = ReadDB2()
                sBindingSource.DataSource = myDataTable
                DataGridView1.DataSource = sBindingSource
                sBindingSource.ResetBindings(False)
      End Sub


    End Class

    我這樣寫就行的通....
    我這樣寫的意思是,不要把DataGridView的Datasource直接指向Datatable,要先把BindingSource物件的DataSource指向Datatable,然後再將DataGridView的DataSource指向BindingSource.
    這樣做有很多好處

    我明白你的意思,現在亦試驗改用你提供的方式,多謝你的意見,多謝。
    但改動處實在頗多,所以要多點時間才知結果。

    2009年2月24日 下午 02:32
  • bauann 表示:

    S.K.Andy 表示:

    我的情況比較複雜,因為變數多。
    我是大致這樣的:

        Const connectionstring As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\SellDay.mdb;"

        Dim oledbconnection As New OleDbConnection(connectionstring)

        Dim queryofgrid As String = "SELECT TBK_Number, Absent, Remarks FROM SellDay WHERE Date = ?"
        Dim oledbcommandofgrid As New OleDbCommand(queryofgrid, OleDbConnection)
        Dim dataadapterofgrid As New OleDbDataAdapter(oledbcommandofgrid)
        Dim datasetofgrid As New DataSet()

    以上是Read Database前的設定。
    以下是Read Database,編寫於兩個Button內。
         oledbcommandofgrid.Parameters.Clear()
         dgvSellDayView.DataSource = Nothing
         oledbcommandofgrid.Parameters.Add("@Date", OleDbType.Date).Value = CDate(txtSellDay.Text)
         dataadapterofgrid.Fill(datasetofgrid, "SellDay")
         dgvSellDayView.DataSource = datasetofgrid.Tables("SellDay")

    顯示第一個資料表時是沒有問題的,但再想單獨第二個資料表時,DatagridView會同時顯示兩個資料表。
    曾加入dgvSellDayView.Rows.clear(),但結果都是一樣。




    DataGridView資料繫結完成之後就會反映出DataTable裡面的資料,假如你是把資料Fill到同一個DataTable裡面(沒有更動過Datagridview的DataSource、DataMember等設定),那麼,在做Fill的動作之前必須要手動的將DataTable裡面的資料清空,不然就會有殘存的資料。
    態度決定一切 ! - blog : http://bauann-makeit.blogspot.com/


    多謝意見,這就是令人費解之處。
    當初設計早期,是還未加入Parameters.Add等的變數,單純以Visual Basic內的資料連結Access,根本是沒有問題,但當開始加入變數,問題就多得很。

    與Fill有關的一句,本來是寫在Form_Load之中,但結果是只可以顯示第一個資料表,第二個資料表無法顯示,才用Fill來顯示,但個人感覺上這不是合理做法。
    2009年2月24日 下午 02:38
  • 哈!我改到這樣終於可以正常:

                oledbcommandofgrid = New OleDbCommand(queryofgrid, oledbconnection)
                dataadapterofgrid = New OleDbDataAdapter(oledbcommandofgrid)
                datasetofgrid = New DataSet()
                dgvSellDayView.DataSource = Nothing
                oledbcommandofgrid.Parameters.Add("@Date", OleDbType.Date).Value = CDate(txtSellDay.Text)
                dataadapterofgrid.Fill(datasetofgrid, "SellDay")
                dgvSellDayView.DataSource = datasetofgrid.Tables("SellDay")

    即是我把兩段程式碼結合一起…不過為何這樣可以成功就不明白。


     

    2009年2月26日 下午 03:39