0

自動生成された削除ボタンがあるグリッドビューがあります。グリッドには1つのデータキー名があり、何らかの理由で次のエラーが発生します:メッセージ:インデックスが範囲外でした。負ではなく、コレクションのサイズよりも小さい必要があります。パラメータ名:インデックス

私は多くのチュートリアルと例を見てきました。このコードは正しく機能するはずですか?

protected void grdBins_RowDeleting(object sender, GridViewDeleteEventArgs e)
{

    int rec_id = int.Parse(grdBins.DataKeys[e.RowIndex].Value.ToString());

     SqlCommand cmd = new SqlCommand();
     cmd.CommandText = "delete from t_run_schedule_lots  " +
                       "where rec_id = @id";

     cmd.Parameters.Add("@id", SqlDbType.Int).Value = rec_id ;

     cmd.CommandType = CommandType.Text;
     cmd.Connection = this.sqlConnection1;
     this.sqlConnection1.Open();
     //execute insert statement
     cmd.ExecuteNonQuery();
     this.sqlConnection1.Close();
     //re-populate grid */
    fill_grid();
     grdBins.EditIndex = -1;
     grdBins.DataBind(); 
     // this bit was just to see if I was capturing the ID field properly. 
    lblBins.Visible = true;
     lblBins.Text = rec_id.ToString();
}

誰かがこの仕事をするC#の良い例を知っているなら、それは大いにありがたいです。

4

3 に答える 3

0

DataKeyNames="rec_id"グリッドビューのaspxセットがないように 聞こえますか?ページにデータキーが何であるかを通知していない場合、データキーにアクセスできません

これは、コードのリファクタリングされたバージョンです。

protected void grdBins_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
       int rec_id = int.Parse(grdBins.DataKeys[e.RowIndex].Value.ToString());
       using (SqlConnection conn = new SqlConnection(connectionString)){
            conn.Open();
            string cmdText = @"delete from t_run_schedule_lots
                               where rec_id = @id";
            using (SqlCommand cmd = new SqlCommand(cmdText, conn)){
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@id", rec_id);
                cmd.ExecuteNonQuery();
            }
       }
       grd.EditIndex = -1;
       fill_grid();
       grdBins.DataBind(); 
}
于 2012-11-02T15:56:43.900 に答える
0

私はあなたの質問を誤解しているかもしれませんが、ここによると、EditIndexプロパティはゼロベースであるため、-1に設定することはできません。その値に設定すると、ArgumentOutOfRangeExceptionがスローされます。

于 2012-11-02T15:57:49.880 に答える
0

これが私がそれを機能させるためにしたことです:

GridViewRow row = (GridViewRow)grdBins.Rows[e.RowIndex];
            Label id = (Label)row.FindControl("Label9");

             SqlCommand cmd = new SqlCommand();
             cmd.CommandText = "delete from t_run_schedule_lots  " +
                               "where rec_id = @id";

             cmd.Parameters.Add("@id", SqlDbType.Int).Value = Convert.ToInt32(id.Text) ;

RowIndexオプションが機能しない理由はわかりませんが。とにかくそれは今働いています。

于 2012-11-02T16:16:42.090 に答える