|来自另一个线程的C#| DataGridView.Add()不生成滚动条

|来自另一个线程的C#| DataGridView.Add()不生成滚动条,c#,multithreading,winforms,datagridview,scrollbar,C#,Multithreading,Winforms,Datagridview,Scrollbar,我有一个问题,DataGridView从另一个线程获取数据。 我的英语不是最好的,所以下面是代码: private void TaskLoad() { List<taskafterdb> tasklist = new List<taskafterdb>(); this.tasklistTableAdapter.FillTaskBoard(sHADOWv5_testDataSet.tasklist) var s = from x in sHADOWv

我有一个问题,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方法重构为两个独立的方法。第一个调用getTask,它只从数据库中获取数据,其他什么都没有。第二个名为ShowTasks,负责将任务加载到数据网格中

  • 线程应该只调用GetTasks,在收到结果后,使用DataGrid的BeginInvoke方法在主线程中运行ShowTasks并向其传递结果


  • 我在电话上写的,所以不能给你看一个示例代码。如果您仍然被卡住,请告诉我,稍后我将向您展示一些示例代码。

    通常,如果您有后台线程,该线程中的代码不应与UI线程交互。设置数据源和调用Form1_Resize是明显的UI调用,因此需要重构。线程上的
    Abort()
    是一种代码气味:请参阅谢谢您警告我!在这种情况下,这并不重要,因为iSharedWorkOne布尔值,但在其他情况下,您迫使我重新思考我的代码。。。再次感谢!:)谢谢你,它更好,但仍然不是最好的。。。我将根据您的说明改进代码,如果有效,我将标记您的作为答案!谢谢,祝你圣诞快乐:)好了,现在没那么重要了。。。我在淡入时使用
    .visible
    解决了GUI故障。我相信你的解决方案是完美的,只是我的代码太复杂了,所以我接受这个答案。非常感谢。
        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();
        }