2016-02-17 7 views
0

Мое приложение требует регулярного автоматического обновления данных для данных из базы данных, чтобы отразить изменения в системе, что не является проблемой.C# - Обновление Datagridview

Проблема заключается в том, что при обновлении datagridview он временно замораживает пользовательский интерфейс и предотвращает прокрутку. Поэтому я могу представить два возможных решения:

Чтобы приостановить обновления при активном событии пользовательского интерфейса, хотя я не знаю, каким будет глобальное пользовательское событие?

Или использовать фоновый рабочий для обновления datagridview - хотя я не знаю, как вы обновляете пользовательский интерфейс от рабочего стола?

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; 
    } 
} 

EDIT:

Есть ли событие, которое срабатывает, когда полосы прокрутки из DataGridView сначала щелкнул как MouseDown, но и для скроллинга? Событие прокрутки происходит после того, как действие прокрутки будет так поздно.

+0

Вы считаете, что используете класс SqlDependency, где вам нужно будет настроить загрузку данных по-разному. https://msdn.microsoft.com/en-us/library/62xk7953%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 –

+0

Интересный вариант, хотя скорость, с которой данные будут меняться, может быть довольно быстрой <100 мс в зависимости от подключения OPC и активности ПЛК. Таким образом, скорость обновления пользовательского интерфейса будет выше, чем периодический метод. –

ответ

0

Вы можете разделить ответственность. Вероятно, ваш трудоемкий процесс - это получение данных из базы данных, а не назначение источника данных.

На вашем рабочем столе вы можете получить информацию из базы данных. По завершении просто присвойте заполненную таблицу вашему 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; 
    } 
} 
+0

Интересная идея, она по-прежнему заставляет пользовательский интерфейс делать паузу, когда происходит обновление. при прокрутке datagridview. Хотя мне нравится метод передачи данных обратно в задачу переднего плана. –

0

Вы можете инициализировать таймер нить, которая отвечает за выборку новых данных и обновить DataGrid

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

О прокрутке вопроса, я столкнулся с другой проблемой до того, что после того, как update selectedRow станет 0. Я решил эту проблему, привязав DataTable к DataGrid и объединив два результата вместе.

var newData = // your data as DataTable Format; 

    // Get Current Scroll position 
    var scrollingRowIndex = MyDataGridView.FirstDisplayedScrollingRowIndex; 

    // Get Current Row 
    var currentRow = MyDataGridView.CurrentCell != null 
           ? MyDataGridView.CurrentCell.RowIndex 
           : -1; 

    DataTable bindedData; 
    var currentDataSource = MyDataGridView.DataSource as DataTable; 


    if (currentDataSource != null) 
    { 
     currentDataSource.Merge(newData); 
     bindedData = currentDataSource; 
    } 
    else 
    { 
     bindedData = newData; 
    } 

    MyDataGridView.DataSource = bindedData; 
    MyDataGridView.Update(); 

    // set Current Scroll position 
    if (scrollingRowIndex > -1) 
     MyDataGridView.FirstDisplayedScrollingRowIndex = scrollingRowIndex; 

    // set Current Row 
    if (currentRow > -1) 
     MyDataGridView.Rows[currentRow].Selected = true; 
+0

К сожалению, это все еще прерывает прокрутку, если обновление происходит при перетаскивании полосы прокрутки. –

+0

@benb Я думаю, это произошло потому, что сетка обновляет свой размер и перерисовывает его компоненты, включая прокрутку 'MyDataGridView.Update()' .. Но предыдущий код будет удерживать положение прокрутки даже при обновлении. (я не уверен, но я думаю, что это произошло). –

Смежные вопросы