2017-01-28 3 views
0

У меня есть datagrid, который обновляется каждые 3 секунды, а при обновлении происходит Datatable, каждый раз неожиданно сбрасывается. То, что я делаю, - это добавление значений из одного документа в другой.Datatable неожиданно возвращается в исходное состояние

Однако, если используется «DefaultView.ToTable», он сохраняет данные.

В принципе, у меня есть 2 datTables dtTopSQL и dtCurTopSQL.

dtTopSQL получает новые данные и добавляет к datCurTopSQL datatable, и я хочу хранить строки в dtCurTopSQL;

// Initial Load the Datatable Structure 
    private void Main_Load(object sender, EventArgs e) 
    { 
     dtTopSQL.Columns.Add("SQL_ID", typeof(string)); 
     dtTopSQL.Columns.Add("Count", typeof(Int16)); 
     dtTopSQL.Columns.Add("CurTime", typeof(DateTime)); 
    } 

// Timer start refreshing the datagrid 
private void timer_TimerTopSQL(object sender, EventArgs e) 
    { 
     dtTopSQL.Clear(); // Clear before the Fill 
     odaTopSQL = new OracleDataAdapter(getTopSQLString, oradb); 
     odaTopSQL.Fill(dtTopSQL); 
     getTopSQL(); 
    } 

// Merging datatable starts here. 
public void getTopSQL() 
    { 
     for (int i = 0; i < dtTopSQL.Rows.Count; i++) 
     { 
      bool isDupe = false; 
      for (j = 0; j < dtCurTopSQL.Rows.Count; j++) 
      { 
       if (dtTopSQL.Rows[i][0].ToString() == dtCurTopSQL.Rows[j][0].ToString()) 
       { 

        dtCurTopSQL.Rows[j][1] = int.Parse(dtCurTopSQL.Rows[j][1].ToString()) + int.Parse(dtTopSQL.Rows[i][1].ToString()); 
        dtCurTopSQL.Rows[j][2] = CurDate; 
        isDupe = true; 
        break; 
       } 
      } 

      if (!isDupe) 
      { 
       dtCurTopSQL.ImportRow(dtTopSQL.Rows[i]); 
       dtCurTopSQL.Rows[j][2] = CurDate; 
      } 
     } 

     ugTopSQL.DataSource = dtCurTopSQL; // Bind the merged Datatable. 
    } 

Над кодом работает, если я использую ниже, прежде чем просто привязывать данные;

dtCurTopSQL = dtCurTopSQL.DefaultView.ToTable(); 

Однако я не понимаю, почему? Я хочу хранить данные без использования DefaultView.ToTable

Не могли бы вы объяснить, пожалуйста?

ответ

0

Над кодом работает, если я использую ниже, прежде чем просто привязывать данные;

dtCurTopSQL = dtCurTopSQL.DefaultView.ToTable();

Однако я не понимаю, почему? Я хочу, чтобы хранить данные без использования DefaultView.ToTable

ugTopSQL.DataSource = dtCurTopSQL; // Bind the merged Datatable.

Первый раз выполняется это утверждение, что DataSource изменения от нуля до dtCurTopSQL. Каждый последующий раз, когда он выполняется, средство настройки DataSource проверяет, совпадает ли новое значение с его существующим значением, и если это так, он ничего не делает.

Назначив новую таблицу dtCurTopSQL перед назначением DataSource, вы назначаете новый объект DataSource, поэтому он действует в соответствии с новым источником.

простое решение было бы добавить

ugTopSQL.DataSource = null;

в качестве первого оператора в методе getTopSQL.

+0

Спасибо за ответ. Однако это не сработало. –

0

Что вы делаете, абсолютно не нужно. Когда UltraGrid привязан к DataTable каждый раз, когда строки таблицы данных меняются, сетка автоматически отображает это изменение. Таким образом изменить событие Load, как это:

// Initial Load the Datatable Structure 
    private void Main_Load(object sender, EventArgs e) 
    { 
     dtTopSQL.Columns.Add("SQL_ID", typeof(string)); 
     dtTopSQL.Columns.Add("Count", typeof(Int16)); 
     dtTopSQL.Columns.Add("CurTime", typeof(DateTime)); 
     ugTopSQL.DataSource = dtCurTopSQL; // Bind the merged Datatable. 
    } 

Затем удалите эту строку из метода getTopSQL:

ugTopSQL.DataSource = dtCurTopSQL; // Bind the merged Datatable. 

Таким образом, любые изменения, внесенные в dtCurTopSQL будет автоматически показаны в сетке без установки DataSource сетки в , который, кстати, является дорогостоящей операцией и не должен выполняться каждые три секунды.

+0

привет, спасибо за ответ. однако он ничего не возвращает. –

+0

Что не возвращает ничего? – wnvko

+0

Источник данных не является обязательным. Сетка ничего не показывает. –

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