2012-12-26 59 views
2

我有一個SQL服務器,我想在我的應用程序的主窗體中顯示它。 我遵循一些指南,併成功地嘗試鏈接dataGrid和SQL Server表。從SQL服務器更新datagrid - 更新過程不起作用

問題是,當我想更新數據網格並同步/重新從SQL服務器重新加載表。

我有一個事件處理程序調用一個函數updateDatadrid()每次我添加/數據庫編輯行。

當我第一次啓動應用程序,我調用這個函數,它的工作,但在那之後,如果我再次與處理程序調用它,我得到了一些錯誤。

跨線程操作無效:從線程 以外的線程訪問控件'',而不是創建它的線程。

功能外(全局變量):

SqlConnection sConDataGrid; 
DataSet dbDataSet; 
SqlDataAdapter da; 
BindingSource dbBind; 
string sqlCommand; 

EDIT - I forgot to add : 
DataGridView _dbView; 

這是我的代碼:

private void updateDataGrid() 
{ 
     using (sConDataGrid = new SqlConnection("Data Source=" + SettingsForm.getAddress + ";Initial Catalog=" + SettingsForm.getDatabase + ";Integrated Security=False;User Id=" + SettingsForm.getUser + ";Password=" + SettingsForm.getPassword + ";Connect Timeout=0;")) 
     { 
      sConDataGrid.Open(); 
      sqlCommand = "select top 200 * FROM cstPackages order by _dateTime desc"; //reading the db from end to start 
      using (da = new SqlDataAdapter(sqlCommand, sConDataGrid)) 
      { 
       da.Fill(dbDataSet, "cstPackages"); 
        dbBind = new BindingSource(dbDataSet, "cstPackages"); 
        _dbView.DataSource = dbBind; 
       sConDataGrid.Close(); 
      } 
     } 
} 

我試圖與它玩,從第一後只能調用到da.Fill()功能當我調用這個函數,但它沒有刷新數據網格。 我試圖清除數據集,然後再次填充它,但它使程序崩潰。 我想只是做_dbView.Refresh()但它沒有工作以及..

編輯 我不明白,爲什麼,如果我做一個按鈕,我把「點擊」事件處理程序,我」 m從這個事件處理程序調用我的函數 - 它的工作! 如果我從SerialPortdataReceived事件處理程序調用此函數 - 我得到這個錯誤!有什麼不同? 我想也許我創建的事件處理程序不是以正確的方式創建的,所以我只是拖動了一個SerialPort控件窗體設計器,並雙擊事件,發生了同樣的情況。

我試圖讓一個計時器,把它啓用,並在函數結束就打電話給stop(),並且在連續接收到其設置爲start(),但一切我在SerialPort處理程序做的是像「外部」程序。它不啓動計時器。

+0

我假設_dbView是你的DataGrid。是對的嗎?您是否在設置DataSource的行之後嘗試過_dbView.DataBind()? – Melanie

+0

@Melanie - 是的,這是我的DatGrid,我沒有嘗試過,但我沒有檢查,並沒有這樣的功能:/ – Itay

+0

_Cross-thread操作無效:控制'從非線程訪問它創建的線程._什麼控制和發生此錯誤的位置?看起來你試圖從不同的線程訪問某些東西,而不是創建東西。可能是dataGridView。解決方案可以通過Invoke訪問它,但不能告訴你更多,除非你提供有關錯誤的更多細節 – erem

回答

1

解決 看完這個:http://msdn.microsoft.com/en-us/library/ms171728%28VS.80%29.aspx 我嘗試使用調用,和它的工作!

new code: 
     delegate void SetDataGridCallback(); 

     private void updateDataGrid() 
     { 
      if (this._dbView.InvokeRequired) 
      { 
       SetDataGridCallback d = new SetDataGridCallback(updateDataGrid); 
       this.Invoke(d, new object[] { }); 
      } 
      else 
      { 
       using (sCon2 = new SqlConnection("Data Source=" + SettingsForm.getAddress + ";Initial Catalog=" + SettingsForm.getDatabase + ";Integrated Security=False;User Id=" + SettingsForm.getUser + ";Password=" + SettingsForm.getPassword + ";Connect Timeout=0;")) 
       { 
        sCon2.Open(); 
        string sqlCommand = "select top 200 * FROM cstPackages order by _dateTime desc"; //reading the db from end to start 
        using (da = new SqlDataAdapter(sqlCommand, sCon2)) 
        { 
         dbDataSet.Clear(); 
         da.Fill(dbDataSet, "cstPackages"); 
         BindingSource dbBind = new BindingSource(dbDataSet, "cstPackages"); 
         _dbView.DataSource = dbBind; 
         _dbView.Refresh(); 
         sCon2.Close(); 
        } 
       } 
      } 
     } 
0

試試這個:

 private void fill_grid() 
    { 

     SqlCommand cmd = new SqlCommand(); 
     cmd.CommandText = "Your sql command "; 

     cmd.Parameters.Add("@param", SqlDbType.VarChar).Value = your_control.Text; 

     cmd.CommandType = CommandType.Text; 
     cmd.Connection = this.sqlConnection1; 
     this.sqlConnection1.Open(); 


     SqlDataAdapter adpt = new SqlDataAdapter(cmd); 
     DataSet ds = new DataSet(); 
     adpt.Fill(ds); 


     your_grid.DataSource = ds; 


     this.sqlConnection1.Close(); 

     this.your_grid.DataBind(); 



    } 

然後,所有你需要做的就是當你需要「刷新」網格調用此方法。

+0

嘿,我不能使用'.DataBind();'。它不顯示這個函數,如果我手動編寫它 - 我得到一個編譯錯誤。 – Itay

+0

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview_methods(v=vs.80).aspx 沒有這樣的方法'DataBind()' – Itay

+0

你必須添加這兩個組件引用您的解決方案System.Data和 System.Data.SqlClient - 然後它將工作。 – briskovich

0

我覺得很多原因。 一:你的緩存不清晰 二:你的電腦緩慢工作 thd:你的刷新不是真正的刷新。 四:也許有時間延遲

第一 數據庫中你做你的「選擇SQL」,請確保你真的犯你可以寫一個backgroundword讓你pragram時間刷新。或者讓一個按鈕刷新。 thd 使您的操作重新打開。

+0

我一直在等待幾分鐘希望它會更新,但它沒有。 現在很少更新數據庫(在我的測試中),我可以控制COM端口數據頻率..我想無效每x秒的背景刷新,因爲我認爲這是一個資源浪費。我確切地知道數據庫何時發生變化,所以我知道何時更新DataGrid。 – Itay