c# - |C#|来自另一个线程的 DataGridView.Add() 没有滚动条

标签 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. 将您的 TaskLoad 方法重构为 2 个独立的方法。第一个称为 GetTasks,它仅从您的数据库中获取数据,仅此而已。第二个称为 ShowTasks,负责将您的任务加载到数据网格中。

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

我正在手机上写这篇文章,所以无法向您展示示例代码。如果您仍然遇到困难,请告诉我,稍后我会向您展示一些示例代码。

关于c# - |C#|来自另一个线程的 DataGridView.Add() 没有滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27600308/

相关文章:

c# - 在非 UI 线程上运行模态对话框

c# - 在C#中将字符串转换为位图

java - 执行等待和通知时返回意外结果

c# - 如何以编程方式在 MultiSelectionComboBox 中选择一个(或多个)项目?

c# - 使用任务保持 UI 响应,处理 AggregateException

c# - 返工 EventWaitHandle 以异步等待信号

c# - 限制向 ToolStrip 添加控件

c# - 删除列表中项目的最快方法

c# - 页面重定向到上一页?

c# - 将枚举转换为列表