我有一个Windows表单,它将把数据加载到我的datagridview中。
我在这一行中不断收到错误:
dataGridView1.Rows.Add(row);
跨线程操作无效:控制' dataGridView1'从创建它的线程以外的线程访问。
这是我的代码:
public List<string> _checked = new List<string>();
private void getBarcodProperty()
{
string query = "select Name from RfidUnic where Barcode = @barcode";
while (true)
{
while (_checked.Count > 0)
{
SQLiteCommand cmd = new SQLiteCommand(query, sqliteConnection);
cmd.Parameters.AddWithValue("@barcode", _checked[0]);
sqliteConnection.Open();
SQLiteDataReader da = cmd.ExecuteReader();
if (da.Read())
{
if (!da.IsDBNull(0))
{
string[] row = new string[] { da[0].ToString(), "1", _checked[0] };
dataGridView1.Rows.Add(row);
_checked.RemoveAt(0);
}
}
else
{
string[] row = new string[] { "empty", "1", _checked[0] };
dataGridView1.Rows.Add(row);
_checked.RemoveAt(0);
}
sqliteConnection.Close();
}
}
}
请告诉我出错的地方
由于
答案 0 :(得分:8)
您的“getBarcodProperty”函数是从另一个线程而不是从UI线程调用的,您尝试在该方法中访问datagridview,因此它会产生问题。
有两种方法解决问题。
Control.CheckForIllegalCrossThreadCalls = false;
更多细节:http://dotnetstep.blogspot.in/2009/09/cross-thread-operation-not-valid.html
dataGridView1.Invoke(new Action(()=&gt; { dataGridView1.Rows.Add(行); }));
注意:对于每次通话,您必须做同样的事情。
答案 1 :(得分:3)
试试这个:
dataGridView1.Invoke(new Action(() => dataGrideView1.Rows.Add(row)));
但是在wpf的情况下,你必须使用调度员:Change WPF controls from a non-main thread using Dispatcher.Invoke;