我有一个问题,一个DataGridView从另一个线程获取数据。 我的英语不是最好的,所以这里是代码:
private void TaskLoad()
{
List<taskafterdb> tasklist = new List<taskafterdb>();
this.tasklistTableAdapter.FillTaskBoard(sHADOWv5_testDataSet.tasklist)
var s = from x in sHADOWv5_testDataSet.tasklist
orderby x.DATE ascending
select x;
dgv_tasks.DataSource = s.AsDataView();
foreach (var task in sHADOWv5_testDataSet.tasklist)
{
tasklist.Add(new taskafterdb { DATE = task.DATE, COLOR = task.COLOR });
}
tasklist = tasklist.OrderBy(t => t.DATE).ToList();
dgv_tasks.DataSource = tasklist;
foreach (DataGridViewColumn column in dgv_tasks.Columns)
{
column.Frozen = false;
}
dgv_tasks.Columns["TASK"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dgv_tasks.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
dgv_tasks.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dgv_tasks.ScrollBars = ScrollBars.Both;
dgv_tasks.Controls[0].Enabled = true;
dgv_tasks.Controls[1].Enabled = true;
}
这是TaskLoad()方法,它用行填充DGV。
如果我把这个方法放到主线程中,例如:Form1_Load,滚动条就可以正常工作了。 最大的问题是我应该从另一个线程刷新数据:
static public Thread dohardwork;
public void Form1_Load(object sender, EventArgs e)
{
dohardwork = new Thread(hardwork);
dohardwork.Start();
}
private void hardwork()
{
TaskLolad();
Form1_Resize(this, null);
IsHardworkDone = true;
fadeintimer.Enabled = true;
dohardwork.Abort();
}
然后,滚动条消失了......它有一点空间,但仅此而已。 我可以用鼠标或箭头键滚动,但仅此而已......
感谢您提供任何帮助! :)
答案 0 :(得分:1)
以下是您需要做的事情,以提高效果并解决问题
将TaskLoad方法重构为2个单独的方法。第一个叫做GetTasks,它只从你的数据库中获取数据,仅此而已。第二个名为ShowTasks,负责将您的任务加载到数据网格中。
您的线程应该只调用GetTasks,在收到结果后,使用DataGrid的BeginInvoke方法在主线程中运行ShowTasks,并将结果传递给它。
我正在手机上写这个,所以无法向您展示示例代码。如果您仍然被卡住,请告诉我,稍后我会向您展示一些示例代码。