请教专家,为什么出现"发生类型为stackoverflowExcepton "的异常?(100) stackoverflowExcepton 堆栈益处!是第一次执行到这里就出错了吗?跟踪一下! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般不这么用,你这么写就行了dataGrid1.items[2].cells[3].text=500 我没有设置数组,另外这里是win form. datagrid里没有items属性。我跟踪的时候程序永远都执行这一句。之所以这样设置主要是为了自动改变datagrid中的某些列的值。另外,如果我改为 datarow[5]=50;这样的语句也一样的错误。why? 谁能解决呢?stackoverflowException ,这个异常怎么处理? >>我跟踪的时候程序永远都执行这一句。<<我知道原因:当 变量=值; 的时候,会去执行 变量.set 这个默认(隐藏)的方法。因为自己的需要(如:保证赋的值不超出范围),在这个方法中,还会再次调用 自己的set 。如果set方法没有处理好的话,会一直调用自己的set,无穷的递归(死循环)。而递归是需要设置 堆栈 记录递进时的状态,碰到无穷的递进时,堆栈越来越多,超出了系统允许的范围,就有了stackoverflowException的错误!你跟踪的现象肯定是,用F10跟踪,但黄色一直在那一行,按了几十下F10后,不耐烦了,就用F5,结果还是那句出错!就是因为 datagrid调用了自己的set N次。因为我自己写控件的时候碰到过,跟踪了很久才发现的!解决,如果是System.Windows.Forms.DataGrid的话,微软写的,这么多人在用,不应该有问题的!重装系统或vs.net。还有可能,这不是System.Windows.Forms.DataGrid,而是你不知从那里引用进来的。那就找到它的定义在 DataGrid dataGrid1 的 DataGrid 上右键GoToDefinition看看,它是从哪里来的。或者在跟踪的时候用F11,看能不能看到更多的代码! 我试了一下,可以通过。dataGrid1[3,5]代表单元格的第3行,第6列。如果所指单元格没有,则出现“System.ArgumentOutOfRangeException”类型的异常。是否使用了递归或循环一类的流程?能否提供更加详细的上下文程序 我没有用数组,datagrid for win 是微软的,jhnhu(jhnhu)说的有道理,执行时永远也停在那一句。但我在别的form里面同样的语句能正确执行。要怎样解决这个异常呢? 解决,上面已经说过了。你肯定没有引用其他什么类库吗?再新建一个form,把代码拷贝过去! 我试过,在其它form里面完全通过。因为我的程序比较大,在两个稍微复杂一点的程序里就是不通过. quanity=(int)dataGrid[dataGrid.CurrentRowIndex,4] 这种取数据的语句完全没问题.就是给赋值有问题。 其实代码不复杂。大概就是在一个数据集里检测列改变事件,当发生改变后要算出另外一个列的数据,并显示出来。主要代码如下: private void DdIn_ColumnChanged(object sender,System.Data.DataColumnChangeEventArgs e) { try { int dd_quantity = (int)e.Row["电镀数量"]; double inprice = (double)e.Row["进价"];//胚的进价 double dd_quote = (double)e.Row["电镀报价"]; double dd_waste_percent = (double)e.Row["损耗百分比"]; int dd_waste = (int)e.Row["电镀损耗"]; if((dd_quantity-dd_waste)<=0) { MessageBox.Show("这批产品全部报废,没有计算出成本","警告",MessageBoxButtons.OK,MessageBoxIcon.Exclamation); return; } // double prod_cost=(dd_quantity*inprice+(dd_quantity-dd_waste)*dd_quote)/(dd_quantity-dd_waste); double prod_cost; double dd_reasonable_percent; dd_reasonable_percent=(double)dd_waste/dd_quantity; if(dd_reasonable_percent<=dd_waste_percent) prod_cost=(dd_quantity*inprice+(dd_quantity-dd_waste)*dd_quote); else // prod_cost=inprice*(dd_cost_percent*dd_quantity)+dd_quote*(dd_quantity-dd_waste); //产品成本=进价*(电镀总数-厂商应承担的数量)+电镀单价*(电镀数量-损耗数量) prod_cost=inprice*(dd_quantity-(dd_waste-dd_waste_percent*dd_quantity))+dd_quote*(dd_quantity-dd_waste); e.Row["产品成本"]=(object)prod_cost; } catch(Exception ex) { MessageBox.Show(ex.Message); }当执行e.Row["产品成本"]=(object)prod_cost;这一句里显示stackflowException ,跟踪的话永远执行这一句。 求注释范文,详细的代码加注释,学习一下 各位高手大家好,小弟现在想做一个项目,其中有一个要实现类似进度条的功能,不会特来请教 C#大哥们进来。烦恼啊 如何用JS方法获取Reapter控件中选中的CheckBox所在行 超级简单的问题 大家快来答 vs.net 2005中如何创建web service? 急!!!!!!!!!!!!!关于另一个页面刷新的问题.散分 求助不创建实例而递归对象....急等 关于动态返回页面。 把行的记录数 放在一个数组里 ? 新建一个线程,可以启动带参数的方法或函数吗?怎样实现呢. 中国队输了,心情不好,又遇上难题,散分了!(最讨厌马明宇说没能在90分钟内集中精神)
dataGrid1.items[2].cells[3].text=500
我跟踪的时候程序永远都执行这一句。
之所以这样设置主要是为了自动改变datagrid中的某些列的值。
另外,如果我改为 datarow[5]=50;这样的语句也一样的错误。why?
我知道原因:当 变量=值; 的时候,会去执行 变量.set 这个默认(隐藏)的方法。因为自己的需要(如:保证赋的值不超出范围),在这个方法中,还会再次调用 自己的set 。如果set方法没有处理好的话,会一直调用自己的set,无穷的递归(死循环)。而递归是需要设置 堆栈 记录递进时的状态,碰到无穷的递进时,堆栈越来越多,超出了系统允许的范围,就有了stackoverflowException的错误!
你跟踪的现象肯定是,用F10跟踪,但黄色一直在那一行,按了几十下F10后,不耐烦了,就用F5,结果还是那句出错!就是因为 datagrid调用了自己的set N次。
因为我自己写控件的时候碰到过,跟踪了很久才发现的!解决,如果是System.Windows.Forms.DataGrid的话,微软写的,这么多人在用,不应该有问题的!重装系统或vs.net。
还有可能,这不是System.Windows.Forms.DataGrid,而是你不知从那里引用进来的。那就找到它的定义在 DataGrid dataGrid1 的 DataGrid 上右键GoToDefinition看看,它是从哪里来的。或者在跟踪的时候用F11,看能不能看到更多的代码!
dataGrid1[3,5]代表单元格的第3行,第6列。
如果所指单元格没有,则出现“System.ArgumentOutOfRangeException”类型的异常。
是否使用了递归或循环一类的流程?
能否提供更加详细的上下文程序
执行时永远也停在那一句。但我在别的form里面同样的语句能正确执行。
要怎样解决这个异常呢?
再新建一个form,把代码拷贝过去!
就是给赋值有问题。
{
try
{
int dd_quantity = (int)e.Row["电镀数量"];
double inprice = (double)e.Row["进价"];//胚的进价
double dd_quote = (double)e.Row["电镀报价"];
double dd_waste_percent = (double)e.Row["损耗百分比"];
int dd_waste = (int)e.Row["电镀损耗"];
if((dd_quantity-dd_waste)<=0)
{
MessageBox.Show("这批产品全部报废,没有计算出成本","警告",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
return;
}
// double prod_cost=(dd_quantity*inprice+(dd_quantity-dd_waste)*dd_quote)/(dd_quantity-dd_waste);
double prod_cost;
double dd_reasonable_percent; dd_reasonable_percent=(double)dd_waste/dd_quantity;
if(dd_reasonable_percent<=dd_waste_percent)
prod_cost=(dd_quantity*inprice+(dd_quantity-dd_waste)*dd_quote);
else
// prod_cost=inprice*(dd_cost_percent*dd_quantity)+dd_quote*(dd_quantity-dd_waste);
//产品成本=进价*(电镀总数-厂商应承担的数量)+电镀单价*(电镀数量-损耗数量)
prod_cost=inprice*(dd_quantity-(dd_waste-dd_waste_percent*dd_quantity))+dd_quote*(dd_quantity-dd_waste);
e.Row["产品成本"]=(object)prod_cost;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}当执行e.Row["产品成本"]=(object)prod_cost;这一句里显示stackflowException ,跟踪的话永远执行这一句。