2014-12-22 43 views
2

我有一個問題,用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(); 
    } 

,然後滾動條都不見了......有它一點空間,但僅此而已。 我可以用鼠標或箭頭鍵滾動,但只能滾動...

謝謝任何​​幫助! :)

+1

一般來說,如果你有一個後臺線程,該線程中的代碼不應該與UI線程接口。設置DataSource並調用Form1_Resize是顯而易見的UI調用,因此需要重構。你的線程中的'Abort()'是一個代碼異味:請參閱[使用Thread.Abort()有什麼問題](http://stackoverflow.com/q/1559255/719186) – LarsTech

+0

謝謝你提醒我!在這種情況下,由於IsHardworkDone布爾值,這並不重要,但是您迫使我在其他情況下重新考慮我的代碼......再次感謝! :) – RAPTOR

回答

1

以下是你需要,以提高性能與解決您的問題

  1. 重構您TaskLoad方法成2種獨立的方法做什麼。第一個叫做GetTasks,它只能從你的數據庫中獲取數據,僅此而已。第二個叫ShowTasks負責將你的任務加載到數據網格中。

  2. 你的線程只應該調用GetTasks,當收到結果時,使用DataGrid的BeginInvoke方法在主線程中運行ShowTasks,並傳遞結果。

我在手機上寫這個,所以不能給你看一個示例代碼。如果您仍然陷入困境,請告訴我,稍後我會向您展示一些示例代碼。

+0

謝謝,這是更好,但仍然不是最好的...我會根據您的指示改進代碼,如果它有效,我會將您的標記標記爲答案!謝謝你,快樂的聖誕節編碼:) – RAPTOR

+0

好吧,現在並不那麼重要...我在淡入淡出的時候使用'.visible'解決了GUI故障。我相信你的解決方案是完美的,只是我的代碼太複雜了,所以我會接受這個答案。謝謝! – RAPTOR