1

私は次のように設定しているasp.netにグリッドビューを持っています:

     sda1 = new SqlDataAdapter("select * from tran_dtls where tc='" + tcdropDown.SelectedValue + "'and doc_no='" + DocNoTxt.Text + "'", con);
     build = new SqlCommandBuilder(sda1);
     sda1.Fill(ds);                      //ds is a data set
     GridView1.DataSource = ds;
     GridView1.DataBind();

ds を新しいデータ テーブルに渡してグリッド ビューを更新し、データ テーブルに新しい行を追加してから、再びデータ テーブルをグリッドにバインドします。

       dt = (DataTable)ViewState["myViewState"];
              dt = ds.Tables[0];
              dr = dt.NewRow();
              dr["TC"] = Session["TC"];
              dr["sr_no"] = Session["i"].ToString(); //I have more fields but for simplicity only displaying few
              dt.Rows.Add(dr);
              dt.AcceptChanges();
              ViewState["myViewState"] = dt;

              Session["gridRow"] = dt;

今まではすべてスムーズですが、データベースを更新しようとすると(データセットに新しいエントリを挿入した後)、保存ボタンのコードは以下のように機能しません:

 protected void onSaveClick(object sender, EventArgs e)
    {


        dt = (DataTable)Session["gridRow"];// I am passing the data table in a session    as I am entering the new entry from a pop up window
        dt.GetChanges(DataRowState.Modified);


        sda1.Fill(dt);

        sda1.Update(dt);   
    }

面白い部分は、dt の既存のエントリを編集するときに編集 (従来の SQL 更新) を行うが、データ テーブルに追加された新しいエントリを挿入することはなく、エラーもスローしないことです。

4

1 に答える 1

1

この行

dt.AcceptChanges(); 

データテーブル内のすべての行を未変更としてマークします。

電話すると

dt.GetChanges(DataRowState.Modified); 

AcceptChanges() の後に変更された行のみを取得します

さらに、データベースに追加された行を取得するには、正しいステートメントは次のようになります。

dt.GetChanges(DataRowState.Added); 

しかし、既に述べたように、AcceptChanges() 呼び出しのため、これは何も返しません。
AcceptChanges() ステートメントを削除する必要があります。
また、保存ボタンのロジックでこれを呼び出す必要はないと思います

sda1.Fill(dt);    
于 2012-08-09T08:27:48.543 に答える