我有一個問題,用DataGridView從另一個線程獲取數據。 我不是英語最好的,所以這裏是代碼:| C#| DataGridView.Add()從另一個線程沒有滾動條
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();
}
,然後滾動條都不見了......有它一點空間,但僅此而已。 我可以用鼠標或箭頭鍵滾動,但只能滾動...
謝謝任何幫助! :)
一般來說,如果你有一個後臺線程,該線程中的代碼不應該與UI線程接口。設置DataSource並調用Form1_Resize是顯而易見的UI調用,因此需要重構。你的線程中的'Abort()'是一個代碼異味:請參閱[使用Thread.Abort()有什麼問題](http://stackoverflow.com/q/1559255/719186) – LarsTech
謝謝你提醒我!在這種情況下,由於IsHardworkDone布爾值,這並不重要,但是您迫使我在其他情況下重新考慮我的代碼......再次感謝! :) – RAPTOR