TextBox tb = this.GridView1.Rows[e.RowIndex].Cells[1].Controls[0] as TextBox;
        int questionId = Convert.ToInt32(this.GridView1.DataKeys[e.RowIndex].Value);
        上面的正确,下面语句出来错误
        TextBox txtOption = this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0] as TextBox;
        int optionNum= Convert.ToInt32(txtOption.Text);
        未将对象引用设置到对象的实例

解决方案 »

  1.   

    TextBox txtOption =(TextBox) this.GridView1.Rows[e.RowIndex].Cells[2].FindControl[""];        int optionNum= Convert.ToInt32(txtOption.Text); 
      

  2.   

    所谓"未将对象引用设置到对象的实例"的错误一般表示,你使用了某个对象的属性或方法,但是却没有实例化这个对象。
    我估计你的错误可能的原因是:
    1.你的网格控件里面只有两列,但是你却在第3列(Cells[2])中去取值
    2.在第三列里面没有TextBox控件。
    你试试
    TextBox txtOption = (TextBox)this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0];
    如果还是报错,则肯定是原因2.因为使用"as TextBox"进行类型转换的时候,如果不能进行转换,他不会报错,而是返回一个null值,导致你再次调用Text属性是出错。
    我的直觉是原因2的可能性更大。
      

  3.   

    可能是 txtOption 为 null。
      

  4.   

    说的更详细一点,我怀疑你第3列中的第一个控件不是TextBox而是其他的什么东东
      

  5.   


    根据你的 Convert.ToInt32后面的内容判断,估计是txtOption为null。
      

  6.   

     TextBox txtOption = this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0] as TextBox; 
    的txtOption中保存的有值吗
      

  7.   

    TextBox txtOption = this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0] as TextBox;  
    建议换用(TextBox)this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0] 并且try ()catch ()下.
    我怀疑你的this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0]本身有问题.没引用到实例说明你压根就没转化过去.而且用as 转化是不会报错的.没有的话,就转化个null;
      

  8.   

    建议用FindControl方法来做
    TextBox txtOption =(TextBox) this.GridView1.Rows[e.RowIndex].Cells[2].FindControl[""];
      

  9.   

    TextBox txtOption = this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0] as TextBox; 
    问题应该在这里。。
    如果是下一句,那错误应该是转换类型不正确之类的,而不是未将对象引用设置到对象的实例
      

  10.   


    你可以尝试一下,将下面的
    TextBox txtOption = this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0] as TextBox; 
    改为
    TextBox txtOption = new TextBox();
    txtOption = this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0] as TextBox;
    int optionNum= Convert.ToInt32(txtOption.Text);我看了下两个的对比,没错的那个,你没有使用tb,如果你使用tb估计也会报错。(仅仅是估计,我自己没试过)
    如果是我所说的这样的话,那么原因就应该是你使用了还没有实例化的txtbox控件对象,所以导致找不到引用。
      

  11.   

    TextBox txtOption = this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0] as TextBox;  
    跟踪一下txtOption的值是否为null.
    我认为就是txtOption为null造成的
      

  12.   

    很明显txtOption.Text这个值为NULL
      

  13.   

    估计是txtOption这个TextBox根本没有取到,所以即使你在填了值照样报这个错误的
      

  14.   

      自己调式下看看
     
      一种可能是 没有哪个textbox  另一种就是它没有值
      

  15.   

    现在很显然是txtOption没有实例化。。
    应该像10楼所说的那样:
    TextBox txtOption = new TextBox();