2012-10-16 58 views
-1

我有一個手動編程的gridview。我擁有所有事件的所有方法,一切似乎都在工作,但RowUpdating事件。我得到這個錯誤:「對象引用未設置爲對象的實例。」我無法弄清楚這裏發生了什麼。所有的控件都有輸入的值。這是我的代碼。我究竟做錯了什麼??Gridview RowUpdating事件錯誤。

protected void Gridview1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
     { 

      SqlCommand cmd = new SqlCommand(); 

      cmd.CommandText = "update t_sizer_calibration " + 
           "set " + 
           "date = @date " + 
           " time = @time, " + 
           "name = @name, " + 
           "lane = @lane, " + 
           "carriers = @carrier, " + 
           "rev = @REV, " + 
           "new_tare = @n_tare, " + 
           "current_tare = @ctare, " + 
           "min = @min, " + 
           "max = @max," + 
           "sd = @sd, " + 
           "wai = @wai, " + 
           "bad_carriers = @badcar, " + 
           "comments = @comments " + 
           "where calibration_id = @calibration_id"; 

      // define parameters 
      cmd.Parameters.Add("@calibration_id", SqlDbType.VarChar).Value = glblID.Text; 
      cmd.Parameters.Add("@date", SqlDbType.VarChar).Value = gtxtDate.Text; 
      cmd.Parameters.Add("@time", SqlDbType.VarChar).Value = gtxtTime.Text; 
      cmd.Parameters.Add("@name", SqlDbType.Int).Value = glblName.Text; 
      cmd.Parameters.Add("@lane", SqlDbType.Int).Value = Convert.ToInt32(gtxtLane.Text); 
      cmd.Parameters.Add("@carrier", SqlDbType.Decimal).Value = Convert.ToDecimal(gtxtCarriers.Text); 
      cmd.Parameters.Add("@REV", SqlDbType.Decimal).Value = Convert.ToDecimal(gtxtREV.Text); 
      cmd.Parameters.Add("@n_tare", SqlDbType.Decimal).Value = Convert.ToDecimal(gtxtN_Tare.Text); 
      cmd.Parameters.Add("@ctare", SqlDbType.Decimal).Value = Convert.ToDecimal(gtxtC_Tare.Text); 
      cmd.Parameters.Add("@min", SqlDbType.Decimal).Value = Convert.ToDecimal(gtxtMin.Text); 
      cmd.Parameters.Add("@max", SqlDbType.Decimal).Value = Convert.ToDecimal(gtxtMax.Text); 
      cmd.Parameters.Add("@sd", SqlDbType.Decimal).Value = Convert.ToDecimal(gtxtSD.Text); 
      cmd.Parameters.Add("@wai", SqlDbType.Decimal).Value = Convert.ToDecimal(gtxtWAI.Text); 
      cmd.Parameters.Add("@badcar", SqlDbType.Int).Value = Convert.ToInt32(gtxtBadCarriers.Text); 
      cmd.Parameters.Add("@comments", SqlDbType.VarChar).Value = gtxtComments.Text; 

      cmd.CommandType = CommandType.Text; 
      cmd.Connection = this.sqlConnection1; 
      this.sqlConnection1.Open(); 
      //execute insert statement 
      cmd.ExecuteNonQuery(); 
      this.sqlConnection1.Close();   
      //re-populate grid 
      fill_grid(); 
      GridView1.EditIndex = -1; 
      GridView1.DataBind(); 

     } 

這裏是我的rowupdated方法太:

protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e) 
    { 
     fill_grid(); 
     //Reset the edit index. 
     GridView1.EditIndex = -1; 
     //Bind data to the GridView control. 
     GridView1.DataBind(); 
    } 
+2

併線引發錯誤?您可以複製和粘貼異常的堆棧軌道,因爲這肯定會有所幫助。 –

+0

你確定'sqlConnection1'不是null? –

+0

sqlConnection1是頁面的全局連接字符串。我在這個頁面中使用了幾次。 – briskovich

回答

0

this page,從與已經綁定在KeysOldValues將退還給你行的值,並NewValues的性質事件引發。所以你根本不需要訪問控制值。

我會嘗試這樣的:

cmd.Parameters.Add("@calibration_id", SqlDbType.VarChar).Value = e.NewValues["ID"]; 
cmd.Parameters.Add("@date", SqlDbType.VarChar).Value = e.NewValues["date"]; 

...,看看有沒有任何地方讓你。

+0

它們是綁定到列的模板字段中的控件。 – briskovich

+0

假設我正確地理解了你,我上面說過的話確實適用。您需要訪問屬於引發事件的特定網格視圖項目的模板中控件的特定實例。你可以通過爲每個控件執行一個'e.Item.FindControl'來做到這一點。如果你不這樣做,變量永遠不會被分配,並且如果你嘗試訪問它們的屬性,將返回一個空引用異常(你收到的)。 –

+0

錯誤:GridViewUpdateEventArgs不包含「Item」的定義而不包含擴展方法......您是否缺少程序集引用? – briskovich

0

我想通了。您必須使用FindControl來獲取更新語句的新值。

類似如下:

GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex]; 
      int id = Int32.Parse(GridView1.DataKeys[e.RowIndex].Value.ToString()); 
      TextBox comm = (TextBox)row.FindControl("gtxtComments"); 
      TextBox date = (TextBox)row.FindControl("gtxtDate"); ....... and so on. 
相關問題