-1

私は手作業でプログラムしたグリッドビューを持っています。すべてのイベントのすべてのメソッドがあり、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();
    }
4

2 に答える 2

0

このページによると、バインドした行の値は、イベントargsの、、、およびプロパティでKeys返さOldValuesれます。NewValuesしたがって、制御値にアクセスする必要はまったくありません。

私は次のようなことを試みます:

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

...そしてそれがあなたをどこにでも連れて行くかどうか見てください。

于 2012-10-16T17:35:52.890 に答える
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. 
于 2012-10-16T23:13:41.930 に答える