2016-04-05 3 views
0

Gridviewで行を更新すると、 "オブジェクト参照がオブジェクトのインスタンスに設定されていません"が表示されます。私は何時間もの研究を理解することができませんでした。ASP.NETでGridview行を更新するときにエラーが発生するC#

この小さなプロジェクトは、切断されたデータアクセスを処理するためにキャッシュを使用するためのプロジェクトです。

private void GetDataFromDB() 
    { 
     string CS = ConfigurationManager.ConnectionStrings["TST"].ConnectionString; 
     SqlConnection conn = new SqlConnection(CS); 
     string strSelectQry = "Select * From tblStudents"; 
     SqlDataAdapter da = new SqlDataAdapter(strSelectQry, conn); 

     DataSet ds = new DataSet(); 
     da.Fill(ds, "Students");  // fill dataset with records from select query and name table "Students" (can name whatever you like). 

     ds.Tables["Students"].PrimaryKey = new DataColumn[] {ds.Tables["Students"].Columns["ID"] };  

     Cache.Insert("DATASET", ds, null, DateTime.Now.AddHours(24), System.Web.Caching.Cache.NoSlidingExpiration); 

     gvStudents.DataSource = ds; 
     gvStudents.DataBind(); 

    } 


protected void gvStudents_RowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     if (Cache["DATASET"] != null) 
     { 
      DataSet ds = (DataSet)Cache["DATASET"]; 
      DataRow dr = ds.Tables["Students"].Rows.Find(e.Keys["ID"]); // get the row thats being edited 

      dr["Name"] = e.NewValues["Name"];    // update fields in datarow 
      dr["Gender"] = e.NewValues["Gender"]; 
      dr["TotalMarks"] = e.NewValues["TotalMarks"]; 

      // store the dataset back into the cache 
      Cache.Insert("DATASET", ds, null, DateTime.Now.AddHours(24), System.Web.Caching.Cache.NoSlidingExpiration); 

      gvStudents.EditIndex = -1;  // take row out of edit mode 
      GetDataFromCache();    // update gridview with updated dataset from cache 
     } 
    } 

私はライン上で "gvStudents_RowUpdating(...)" メソッドでオブジェクト参照エラーを取得しています::DR [ "名前"] = e.NewValues [ここ

コードです"名"];

+0

がアプリをデバッグしようとしたとヌルが何であるかを確認しました:だから、gvStudents.DataBind();後、データキーから現在のIDを取得し、あなたのRowUpdating方法では、次に

gvStudents.DataKeyNames = new string[] { "ID" }; 

を追加nullになる)? – Gusman

+0

@Gusmanはい、私はそれをデバッグし、drはnullです。しかし、drは編集中のGridview行からのデータを含んでいる必要があります – hmakled

+0

あなたはIDを使ってあなたのキャッシュ上でdrを検索しています。あなたがIDを受け取っているかどうか、そしてキャッシュが本当に動作しているかどうかを確認してください。 – Gusman

答えて

0

データバインド時にデータキーを入力してから、現在のIDを取得するためにRowUpdatingメソッドでデータキーを読み込みます。 DRはすべき(

var currentID = gvStudents.DataKeys[e.RowIndex].Value; 
+0

これを行うと、行のIDだけが表示されます。更新するためにDataRowの形式で更新または変更されている行全体にアクセスする必要があります。 – hmakled

+0

正しい場合、あなたはまだこの行が必要でしょう: 'DataRow dr = ds.Tables [" Students "] Rows.Find(e.Keys [" ID "]);' 'e.Keys [" ID "]'と 'gvStudents.DataKeys [e.RowIndex] .Value'を指定します。 – TheRotag

関連する問題