2017-10-09 38 views
0

我現在有些困惑Datagridview僅在具有異步數據訪問的行中顯示數據?

我,如果我調試下面的方法,設置在DataGrid

的_context變種是從實體框架

每行的單元格的所有數據的方法這樣,所有的數據被設置爲細胞,但數據未顯示

,但只要我刪除第一行註釋的方法(它只是用於測試,無處使用的)一切工作

所以對我來說,它好像有顯示

我搜索的谷歌,但沒有發現任何類似的數據需要進行一些異步訪問

它真的只是在這使得該方法的第一行工作,並沒有任何地方的任何參考公正的任務列表

如果我把第一行的方法結束它不再工作,所以它的工作,只要有一個異步訪問工作之前,每個循環都被調試

並且不,我不能使所有的異步導致我h廣告的一些錯誤,以及一切工作與同步數據訪問

沒有寫代碼,以及,我知道這是在DataGridView

沒有人知道什麼是錯在這裏加載數據的壞的方式?

問候

編輯:剛剛發現,與該行註釋掉,每一次的foreach LOPP的一個新的迭代開始前一行的單元格的值被複位,不這是如何發生的

private async Task InitializeProcessGroupsDgv() 
    { 
     //List<Test> justATest = await _context.Test.ToListAsync(); 

     List<ProcessGroup> processGroups = _context.ProcessGroup.ToList(); 

     _view.Dgv_ProcessGroups.AutoGenerateColumns = false; 
     _view.Dgv_ProcessGroups.DataSource = processGroups; 

     // that the cheboxes for the locks can have 3 states 
     ((DataGridViewCheckBoxColumn)_view.Dgv_ProcessGroups.Columns[13]).ThreeState = true; 
     ((DataGridViewCheckBoxColumn)_view.Dgv_ProcessGroups.Columns[14]).ThreeState = true; 

     foreach (DataGridViewRow row in _view.Dgv_ProcessGroups.Rows) 
     { 
      // set all TestOption-Checkboxes 
      for (int i = 0; i < 8; i++) 
      { 
       if (_curTestRes != null) 
       { 
        row.Cells[i + 1].Value = ((ProcessGroup)row.DataBoundItem).TestResourceProcessGroup.Where(x => x.TestResourceID == _curTestRes.ID).First().TestOptionTestRessourceProcessGroup.Where(x => x.TestOption.Name == row.Cells[i+1].OwningColumn.HeaderText).FirstOrDefault()?.Activated; 
       } 
       else 
       { 
        row.Cells[i + 1].Value = false; 
       } 
      } 

      var testResProcGr = ((ProcessGroup)row.DataBoundItem).TestResourceProcessGroup? 
       .Where(trpg => trpg.TestResourceID == _curTestRes?.ID)?.SingleOrDefault(); 

      // load NrOfImpressions 
      row.Cells[10].Value = testResProcGr?.NrOfImpressions; 

      // set the Lock-CheckBoxes 
      DataGridViewCheckBoxCell dinCell = (DataGridViewCheckBoxCell)row.Cells[13]; 
      DataGridViewCheckBoxCell astmCell = (DataGridViewCheckBoxCell)row.Cells[14]; 

      List<IntrusionBody> ibs = _context.IntrusionBody.Where(x => x.ProcessGroupID == ((ProcessGroup)row.DataBoundItem).ID).ToList(); 

      foreach (var item in ibs) 
      { 
       ((DataGridViewComboBoxCell)row.Cells[12]).Items.Add(item); 
      } 

      ((DataGridViewComboBoxCell)row.Cells[12]).ValueMember = "ID"; 
      ((DataGridViewComboBoxCell)row.Cells[12]).DisplayMember = "Name"; 

      if (testResProcGr == null) 
      { 
       // if new TestRessource => disable lock checkboxes 
       dinCell.ReadOnly = true; 
       dinCell.Value = CheckState.Indeterminate; 
       dinCell.FlatStyle = FlatStyle.Flat; 
       dinCell.Style.ForeColor = Color.DarkGray; 

       astmCell.ReadOnly = true; 
       astmCell.Value = CheckState.Indeterminate; 
       astmCell.FlatStyle = FlatStyle.Flat; 
       astmCell.Style.ForeColor = Color.DarkGray; 
      } 
      else 
      { 
       // DIN 
       if (testResProcGr.DINLocked == null) 
        dinCell.Value = CheckState.Indeterminate; 
       else 
        dinCell.Value = (bool)testResProcGr.DINLocked ? CheckState.Checked : CheckState.Unchecked; 

       // ASTM 
       if (testResProcGr.ASTMLocked == null) 
        astmCell.Value = CheckState.Indeterminate; 
       else 
        astmCell.Value = (bool)testResProcGr.ASTMLocked ? CheckState.Checked : CheckState.Unchecked; 

       row.Cells[11].Value = testResProcGr.NrOfTestPerDay; 
       ((DataGridViewComboBoxCell)row.Cells[12]).Value = testResProcGr.IntrusionBody; 
       row.Cells[15].Value = testResProcGr.Active; 
       row.Cells[16].Value = testResProcGr.TestResourceProcessGroupCertification.Where(x => x.Date.Year == DateTime.Now.Year).FirstOrDefault()?.DIN; 
       row.Cells[17].Value = testResProcGr.TestResourceProcessGroupCertification.Where(x => x.Date.Year == DateTime.Now.Year).FirstOrDefault()?.ASTM; 
      } 
     } 

    } 

回答

0

將方法標記爲async時,它沒有等待操作符是沒有意義的。註釋行中的dummy等待運算符只是在同步執行後的所有其他代碼。 因此,使其工作的最簡單方法是刪除無用的異步修改器。

+0

如果從方法中刪除異步或不同意(當然,當我同步嘗試時刪除它) 如果您有一個標記爲async但沒有等待的方法,該方法將運行同步,所以這不是錯誤 正如我所說,如果我刪除everythign異步它不起作用,如果我只是在foreach循環上面的方法中放置一些異步語句它工作正常,這是我的問題 – Claus