2014-10-27 19 views
0

我有一個處理datareading作爲這樣一類行(注意ischanged是我養指示新行的可用性的事件)DataReader的飼養DataGridView控件 - 由行

public DataRow FetchNext() 
{ 
    DataRow drow = dt.NewRow(); 
    if (dr.Read() && dr.HasRows) //this will loop through rows unless cancel is clicked 
    { 
     try 
     { 
      for (int i = 0; i < listCols.Count; i++) 
      { 
       drow[(DataColumn)listCols[i]] = dr[i]; 
      } 
      dt.ImportRow(drow); 
      totalRowCount++; 
      this.isChanged(); 
      return drow; 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 
    else 
    { 
     return drow; 
    } 
} 

另一類使用這個類實現讀取行並將它們插入到在DataGridView如下(BS是我的BindingSource這勢必數據表DT)

private void buttonGo_Click(object sender, EventArgs e) 
{ 
    myrow = p.FetchNext(); 
    this.dt = p.dt.Copy(); 
    bs.DataSource = dt; 
    dataGridViewMyData.DataSource = bs; 
    bs.ResetBindings(false);  
} 
private void handleChanged() 
{ 
    bs.ResetBindings(false); 
    dt.Rows.Add(p.FetchNext()); 
} 

當我火了一切,我得到:

System.StackOverflowException was unhandled 
_HResult=-2147023895 

任何幫助,將不勝感激。

+1

哪一行代碼產生異常? – 2014-10-27 13:12:08

+0

在fetchnext() – Cogent 2014-10-27 13:17:58

+1

for循環將此'dt.Rows.Add(p.FetchNext());'提高'handleChanged'事件?如果是這樣,它是一個無盡的循環.. – TaW 2014-10-27 14:36:24

回答

0

好了,所以這裏是答案:

public DataRow FetchNext() 
{ 
    DataRow drow = dt.NewRow(); 
    if (dr.Read() && dr.HasRows) //this will loop through rows unless cancel is clicked 
    { 
     try 
     { 
      for (int i = 0; i < listCols.Count; i++) 
      { 
       drow[(DataColumn)listCols[i]] = dr[i]; 
      } 
      dt.ImportRow(drow); 
      totalRowCount++; 
      this.isChanged(); 
      return drow; 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 
    else 
    { 

     return drow; 
    } 
} 

在調用類我實現了一個後臺工作,這對DoWork的:取下一步。當workcompleted下一次也讀取,每次讀取isEnded的值。

private void buttonGo_Click(object sender, EventArgs e) 
     { 
      myrow = p.FetchNext(); 
      this.dt = p.dt.Copy(); 
      bs.DataSource = dt; 
      dataGridViewMyData.DataSource = bs; 
      bs.ResetBindings(false); 
      if (!p.isEnded && !backgroundWorker1.IsBusy) 
      { 
       bs.SuspendBinding(); 
       backgroundWorker1.RunWorkerAsync(); 
      } 
     } 


    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     bs.SuspendBinding(); 
     if (!p.isEnded) 
     { 
      dt.ImportRow(p.FetchNext()); 
     } 

    } 
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    bs.ResumeBinding(); 
    if (!p.isEnded) 
    { 

     backgroundWorker1.RunWorkerAsync(); 
    } 
    else 
    { 

     MessageBox.Show("Done"); 
    } 
    RefreshData(); 

} 

這確實解決了問題,並且網格確實是逐行填充的。但是,對於成千上萬行的查詢,這將非常耗時。