SQL サーバーがあり、それをアプリのメイン フォームに表示したいと考えています。いくつかのガイドに従って、dataGrid と SQL サーバー テーブルをリンクする試みに成功しました。
問題は、データグリッドを更新し、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()
が、うまくいきませんでした..
編集
ボタンを作成し、「クリック」イベントハンドラーを配置して、このイベントハンドラーから関数を呼び出しているのはなぜですか?それは機能しています! SerialPort
dataReceived
イベント ハンドラからこの関数を呼び出すと、このエラーが発生します。違いはなんですか?イベント ハンドラーを適切な方法で作成していないのではないかと考えたのでSerialPort
、デザイナーからコントロールをドラッグし、イベントをダブルクリックしましたが、同じことが起こりました。
タイマーを作成して有効にし、関数の最後に を呼び出しstop()
、シリアル受信で に設定しよstart()
うとしましたが、ハンドラーで行うことはすべてSerialPort
プログラムの「外側」に似ています。タイマーを開始しません。