2016-05-15 7 views
0

У меня есть простое приложение, и я импортирую данные из файла excel в сетку данных. Вот код:Обновление сетки данных wpf. ItemsSource и Items.Refresh() не работает

private void InitializeDataGridView() 
    { 
     //Open the Excel file using ClosedXML. 
     using (XLWorkbook workBook = new XLWorkbook(ExcelFile.ExcelFilePath)) 
     { 
      //Read the first Sheet from Excel file. 
      IXLWorksheet workSheet = workBook.Worksheet(1); 

      //Create a new DataTable. 
      DataTable dt = new DataTable(); 

      //Loop through the Worksheet rows. 
      bool firstRow = true; 
      foreach (IXLRow row in workSheet.Rows()) 
      { 
       //Use the first row to add columns to DataTable. 
       if (firstRow) 
       { 
        foreach (IXLCell cell in row.Cells()) 
        { 
         dt.Columns.Add(cell.Value.ToString()); 
        } 
        firstRow = false; 
       } 
       else 
       { 
        //Add rows to DataTable. 
        dt.Rows.Add(); 
        int i = 0; 
        foreach (IXLCell cell in row.Cells()) 
        { 
         dt.Rows[dt.Rows.Count - 1][i] = cell.Value.ToString(); 
         i++; 
        } 
       } 

       dtGrid.ItemsSource = dt.DefaultView; 
      } 
     } 
    } 

Это работает нормально. Но я хочу добавить некоторые данные. Im с использованием этого кода:

public static void AddData(DateTime date, int time, string title, string description) 
    { 
     // Opening excel file   
     using (XLWorkbook workBook = new XLWorkbook(ExcelFile.ExcelFilePath)) 
     {    
      IXLWorksheet worksheet = workBook.Worksheet("Progress"); // Trying to get the Progress worksheet 
      // Getting table from DataTable 
      var dataTable = GetTable(date, time, title, description); 
      // Searching for last used row and first used column 
      var lastRowUsed = worksheet.LastRowUsed().RowNumber(); 
      var firstColumnUsed = worksheet.FirstColumnUsed().ColumnNumber(); 
      // Insterting data    
      worksheet.Cell(lastRowUsed + 1, firstColumnUsed).InsertData(dataTable.AsEnumerable()); 

      // Adjusting content to fit 
      worksheet.Columns().AdjustToContents(); 
      // Saving excel file 
      workBook.Save(); 
     } 

    } 

    public static DataTable GetTable(DateTime date, int time, string title, string description) 
    { 
     DataTable table = new DataTable(); 
     table.Columns.Add("Data", typeof(DateTime)); 
     table.Columns.Add("Czas(minuty)", typeof(int)); 
     table.Columns.Add("Tytuł", typeof(string)); 
     table.Columns.Add("Opis", typeof(string)); 

     table.Rows.Add(date, time, title, description); 
     return table; 
    } 

И это хорошо работает. У меня проблема с сетью данных. Это не обновление после того, как я добавлю что-то в файл excel.

Я пытался сделать что-то вроде этого:

dtGrid.ItemsSource = null; 
InitializeDataGridView(); 

Он не был работать. Я использовал также dtGrid.Items.Refresh();, он не работал. Как обновить сетку данных после добавления данных в файл excel?

+0

Вы проверили, что после вашего редактирования процесс excel определенно закрывается, то есть вы не можете увидеть какие-либо процессы excel, запущенные в диспетчере задач? Если ваш файл все еще открыт, повторная инициализация вашей сетки, вероятно, не будет работать –

+0

Да, мой файл excel определенно закрывается. Сразу после инициализации и сразу после добавления к нему некоторых данных. – Porqqq

+0

Является ли лист «Прогресс» таким же, как 'WorkSheet (1)'? – Crowcoder

ответ

0

InitializeDataGridView() имеет dataGrid.ItemsSource, ссылающийся на dataTable dt.DefaultView.

Я не вижу того же типа данных, который используется при добавлении новых данных. Если вы создаете новую dataTable и добавляете к ней данные, ее необходимо переподключить как новую ссылку ItemsSource.

Я бы предложил использовать тот же элемент ItemsSource на протяжении всего сеанса, отображая dataGrid.