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

时间:2014-12-22 09:57:53

标签: 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 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 个答案:

答案 0 :(得分:1)

以下是您需要做的事情,以提高效果并解决问题

  1. 将TaskLoad方法重构为2个单独的方法。第一个叫做GetTasks,它只从你的数据库中获取数据,仅此而已。第二个名为ShowTasks,负责将您的任务加载到数据网格中。

  2. 您的线程应该只调用GetTasks,在收到结果后,使用DataGrid的BeginInvoke方法在主线程中运行ShowTasks,并将结果传递给它。

  3. 我正在手机上写这个,所以无法向您展示示例代码。如果您仍然被卡住,请告诉我,稍后我会向您展示一些示例代码。