2014-10-27 17 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(); 

} 

这确实解决了问题,并且网格确实是逐行填充的。但是,对于成千上万行的查询,这将非常耗时。