我的应用程序需要使用数据库中的数据定期自动更新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但滚动条?滚动事件发生在滚动操作之后,所以会迟到。
答案 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;
}