C# - Datagridview更新

时间:2016-02-17 13:02:02

标签: c# datagridview

我的应用程序需要使用数据库中的数据定期自动更新datagridview以反映系统中的更改,这不是问题。

我的问题是,当datagridview更新时,它会暂时冻结UI并阻止滚动。所以我可以想到两个可能的解决方案:

在UI事件处于活动状态时暂停更新 - 虽然我不知道全局用户事件是什么?

或者使用后台工作程序来更新datagridview - 虽然我不知道如何从后台工作者更新UI?

using (SqlDataAdapter a = new SqlDataAdapter("SELECT Name,Value FROM dbo.IOData", c))
{
  DataTable IOProcData = new DataTable();
  // Populate data table
  a.Fill(IOProcData);
  // Record displayed row
  int temp = dataGridView1.FirstDisplayedScrollingRowIndex;
  IOBinding.DataSource = IOProcData;
  // Reset displayed row
  if (temp > 0)
  {
    dataGridView1.FirstDisplayedScrollingRowIndex = temp;
  }
}

修改

首次点击datagridview的滚动条时是否会触发事件,例如mousedown但滚动条?滚动事件发生在滚动操作之后,所以会迟到。

2 个答案:

答案 0 :(得分:0)

您可以分离责任。您耗时的过程可能是从数据库获取数据,而不是分配数据源。

在backgroundWorker中,您可以从数据库中获取信息。 完成后,只需将填充的表格分配给gridview。

以下是一个例子:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
        if (e.Error != null) {
            //Handle error
        } else {
            IOBinding.DataSource = (DataTable)e.Result;
        }
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
    using (SqlDataAdapter a = new SqlDataAdapter("SELECT Name,Value FROM dbo.IOData", c)) {
        DataTable IOProcData = new DataTable();
        // Populate data table
        a.Fill(IOProcData);
        // Record displayed row
        e.Result = a;
    }
}

答案 1 :(得分:0)

您可以初始化一个负责获取新数据和更新DataGrid的Timer线程

    function countdown(element) {
    var start_value = "Free trial bonus has expired!"
    interval = setInterval(function() {
        var el1 = document.getElementsByClassName("timerx")[0];
        var el2 = document.getElementsByClassName("timerx")[1];
        if(seconds == 0) {
            if(minutes == 0) {
                el1.innerHTML = start_value;                    
                el2.innerHTML = start_value;                    
                clearInterval(interval);
                return;
            } else {
                minutes--;
                seconds = 60;
            }
        }
        if(minutes > 0) {
            var minute_text = minutes + (minutes > 1 ? ' minutes' : ' minute');
        } else {
            var minute_text = '';
        }
        var second_text = seconds > 1 ? 'seconds' : 'second';
        el1.innerHTML = minute_text + ' ' + seconds + ' ' + second_text + '';
        el2.innerHTML = minute_text + ' ' + seconds + ' ' + second_text + '';
        seconds--;
    }, 1000);
}

关于滚动问题,在更新之后我遇到了另一个问题,即selectedRow变为0。 我通过将DataTable绑定到DataGrid并将两个结果合并在一起解决了这个问题。

internal void InitTimer()
    {
        _timer = new Timer();
        _timer.Tick += (sender, args) => BindDataGrid();
        _timer.Interval = 1000;
        _timer.Start();
        _timerStart = true;
    }