//允许操作其它线程创建的控件
Control.CheckForIllegalCrossThreadCalls = false;
*************************************************************
//无数据时清空datagridview,连同行列结构一起删除。
dataGridView1.DataSource = null;
*************************************************************
在子线程中刷新dataGridView出现滚动条无显示或假死的解决办法
在多线程中对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的ScrollBars设置为了Both,数据量大于DataGridView显示的的范围,而且没有冻结列的情况下,解决方法如下:
一是使用 Invoke 将执行数据绑定的代码交回给主线程(因为 DataGridView 是主线程创建的);
二是在指定 DataSource 之前,将其置为 null。
实现代码如下:
//放在主程序中
private delegate void InvokeHandler();
//放入刷新dataGridView的子线程中
this.Invoke(new InvokeHandler(delegate()
{
dataGridView1.DataSource = null;
dataGridView1.DataSource = dgv_dt;
}));
***************************************************************
使用MelsecFxSerial类库连接PLC读DM数据成功后,断开连接,再重读DM数据,经常出现读数据错误提示
原因是PLC再次连接时没有执行关闭指令,解决方法如下:
首先在类函数中实例化连接对象,接着在连接PLC的按钮中先关闭PLC连接对象、重新实例化后再打开PLC连接,操作代码如下:
public partial class Form1 : Form
{
private MelsecFxSerial melsecSerial = new MelsecFxSerial();
//连接PLC
private void button1_Click(object sender, EventArgs e)
{
melsecSerial.Close();
melsecSerial = new MelsecFxSerial();
//连接参数设置代码此处省略....
melsecSerial.Open();
}
}