C# 从线程调用DataGridView时,滚动条变灰

C# 从线程调用DataGridView时,滚动条变灰,c#,winforms,datagridview,C#,Winforms,Datagridview,我有一个用C#编写的windows窗体应用程序。我将所有代码(执行restapi调用、构建列表、将列表放入datagridview)放入一个线程中,这样我就可以检查线程并在运行时更新客户。执行此操作时,除滚动条呈灰色外,其他所有功能均正常工作 只有滚动条有问题吗? 如果您的代码仍然在主线程中,那么您的表单将无法执行任何操作。(您需要再次检查) 但事实上,您可以使用Application.DoEvents()完成后将数据绑定到gridView。 此方法将停止所有线程并更新视图,请确保这不是一个完美

我有一个用C#编写的windows窗体应用程序。我将所有代码(执行restapi调用、构建列表、将列表放入datagridview)放入一个线程中,这样我就可以检查线程并在运行时更新客户。执行此操作时,除滚动条呈灰色外,其他所有功能均正常工作

只有滚动条有问题吗?
如果您的代码仍然在主线程中,那么您的表单将无法执行任何操作。(您需要再次检查)

但事实上,您可以使用
Application.DoEvents()完成后将数据绑定到gridView。
此方法将停止所有线程并更新视图,请确保这不是一个完美的解决方案,此方法在跨线程情况下有时会带来不可逆的错误

无论如何,我希望使用
System.Windows.Forms.Timer
使它变得简单。
这是样品。
启动窗体后,计时器将工作100次,间隔为5秒

private int loopCnt=1;
//您不需要这样做,只需从“工具箱”中拖动计时器组件即可
//在设计时(模式)的任何位置发送到表单。
//private System.Windows.Forms.Timer timer1=新的System.Windows.Forms.Timer();
私有void Form1\u加载(对象发送方、事件参数e)
{
//这取决于您在窗体加载时启动计时器或在单击某些按钮后触发计时器。
//这个.loopCnt=1;
this.timer1.Enabled=true;
this.timer1.Interval=1000*5;
this.timer1.Start();
}
私有无效计时器1_刻度(对象发送方,事件参数e)
{
CreateDataAndBind(loopCnt++);
如果(loopCnt>100)
{
this.timer1.Stop();
}
}
public void CreateDataAndBind(int loopCount)
{
数据集dsTemp=新数据集();
#区域:定义数据表和列
DataTable dtTemp=新DataTable();
DataColumn dColKey=新的DataColumn(“key”,typeof(int));
DataColumn dColName=新数据列(“名称”,类型(字符串));
dtTemp.Columns.Add(dColKey);
dtTemp.Columns.Add(dColName);
添加(新数据列(“角色”);
添加(新的数据列(“timeText”,typeof(String));
添加(新的数据列(“时间值”,typeof(DateTime));
#端区
dsTemp表格添加(dtTemp);
对于(int-index=0;index<10;index++)
{
DataRow dRow=dtTemp.NewRow();
dRow[0]=循环计数;
卓尔[1]=“乔纳森”;
dRow[2]=“开发者”;
dRow[3]=DateTime.Now.ToString(“yyyy-MM-dd HH:MM:ss”);
dRow[4]=DateTime.Now;
数据临时行添加(dRow);
}
这个.BindDataSet(dsTemp);
}
公共委托void updateDataSetDelegate(数据集ds);
私有void BindDataSet(数据集ds)
{
if(this.dataGridView1.invokererequired)
{
Invoke(新的updateDataSetDelegate(BindDataSet),新对象[]{ds});
}
其他的
{
this.dataGridView1.DataSource=ds.Tables[0];
}
}

没有代码,你就得不到多少帮助。您应该只与主线程上的GUI控件交互。使用其他线程对数据进行处理,然后将其传递给GUI控件。