C# 为DatagridView控件提供数据的DataReader-逐行

C# 为DatagridView控件提供数据的DataReader-逐行,c#,datagridview,sqldatareader,stack-overflow,C#,Datagridview,Sqldatareader,Stack Overflow,我有一个处理数据读取的类。请注意,ischanged是我引发的一个事件,用于指示新行的可用性 public DataRow FetchNext() { DataRow drow = dt.NewRow(); if (dr.Read() && dr.HasRows) //this will loop through rows unless cancel is clicked { try { for (

我有一个处理数据读取的类。请注意,ischanged是我引发的一个事件,用于指示新行的可用性

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;
    }
}
当我点燃一切时,我得到:

System.StackOverflowException was unhandled
_HResult=-2147023895

任何帮助都将不胜感激。

好的,下面是答案:

    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;
    }
}

这确实解决了问题,网格确实是逐行填充的。但是,对于具有数十万行的查询,这将非常耗时。

哪行代码会产生异常?FetchNext中的for循环将this dt.rows.Addp.FetchNext;举起手来改变事件?如果是这样,这是一个无止境的循环。这会引发stackoverflowexception吗?如果无止境的循环声明任何资源,它会引发stackoverflowexception或outofmemory异常。如果不是的话,它就挂了。。addRow肯定会占用资源。
    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;
    }
}
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();

}