2

我有一个 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()但它没有那么好..

编辑 我不明白,为什么如果我制作一个按钮,然后放置“click”事件处理程序,并且我正在从这个事件处理程序调用我的函数 - 它正在工作!如果我从SerialPort dataReceived事件处理程序调用这个函数 - 我得到这个错误!有什么不同?我想也许我没有以正确的方式创建事件处理程序,所以我只是SerialPort从设计器中拖动了一个控件并双击事件,同样的事情发生了。

我尝试制作一个计时器,将其置于启用状态并在函数结束时调用它stop(),并在接收到的串行中将其设置为start()但我在SerialPort处理程序中所做的一切就像“在”程序之外。它不会启动计时器。

4

3 回答 3

1

已解决 阅读此内容后:http: //msdn.microsoft.com/en-us/library/ms171728%28VS.80%29.aspx 我尝试使用 Invokes,它成功了!

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();
                    }
                }
            }
        }
于 2012-12-27T19:50:11.707 回答
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();



    }

然后,您所要做的就是在需要“刷新”网格时调用此方法。

于 2012-12-27T00:06:06.477 回答
0

我想很多原因。一:你的缓存不清除二:你的电脑工作缓慢thd:你的刷新不是真的刷新。四:可能有时间延迟

首先你在数据库中做你的“select sql”,确保你真的提交了两个你可以写一个 backgroundword 让你的 pragram 时间刷新。或制作一个按钮来刷新。thd 使您的操作重新打开。

于 2012-12-27T03:49:26.047 回答