close

撰寫DataSet與DataAdapter達成GridView各種功能:編輯更新刪除...(不搭配SsqlDataSource小精靈)

重點:

 

1.GridView 設定 DataKeyNames:id

 

2.DataSet與DataAdapter的搭配:

   (1).使用DataAdapter將從資料庫撈出來的資料,填入DataSet中的每個DataTable。(.Fill方法就是在做這件事)

   (2).加入,更新或刪除DataRow物件,以此變更在個別DataTale物件中的資料。

   (3).呼叫DataAdapter的Update()方法,讓DataSet(記憶體)中的資料與資料庫資料同步。(不一定是Update()方法,Delete...            都有可能用到)

 

3.後置程式碼(註解都在裡面了)

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
DBInit(); //---只有第一次執行本程式,才會進入 if判別式內部。
}
}

protected void DBInit()
{
SqlConnection Conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString);
//從資料庫撈出這些資料
SqlDataAdapter myAdapter = new SqlDataAdapter("select id,title,author from test", Conn);

DataSet ds = new DataSet();

try
{
//將撈出資料給DataSet
myAdapter.Fill(ds, "test");
//跟GridView做綁訂
GridView1.DataSource = ds;
GridView1.DataBind();
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
}

//GridView更新事件
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//先宣告三個TextBox接抓出來的TextBox值
TextBox my_test_time, my_title, my_author;

//注意是用.controls[]集合抓取textBox值,Control[0]:代表不論裡面放什麼控制項都抓第一個控制項
my_test_time = (TextBox)GridView1.Rows[e.RowIndex].Cells[4].Controls[0];
my_title = (TextBox)GridView1.Rows[e.RowIndex].Cells[5].Controls[0];
my_author = (TextBox)GridView1.Rows[e.RowIndex].Cells[6].Controls[0];

SqlConnection Conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString);
SqlDataAdapter myAdapter = new SqlDataAdapter();

//Step2 整合要回到DataSet去更新的指令
myAdapter.UpdateCommand = new SqlCommand("update [test] set [title]=@title,[author]=@author where [id] = @id", Conn);

//Step1
//先宣告要加密並且更新的欄位,上面用我們自己宣告的TextBox接到原本的值後,經過修改我們要將TextBox值放回去(更新)
//@title對應Step2的欄位(要更新的欄位),my_title.Text是我們改過後的值
myAdapter.UpdateCommand.Parameters.AddWithValue("@title", my_title.Text);
myAdapter.UpdateCommand.Parameters.AddWithValue("@author", my_author.Text);
//myAdapter.UpdateCommand.Parameters["@test_time"].Value = Convert.ToDateTime(my_test_time.Text);
myAdapter.UpdateCommand.Parameters.AddWithValue("@id", (int)GridView1.DataKeys[e.RowIndex].Value);


//Step3
//到記憶體去更新DataSet
DataSet ds = new DataSet();
myAdapter.SelectCommand = new SqlCommand("select * from test", Conn);
myAdapter.Fill(ds, "test");
//修改記憶體的欄位值(真正更新)
ds.Tables["test"].Rows[e.RowIndex]["test_time"] = my_test_time.Text;
ds.Tables["test"].Rows[e.RowIndex]["title"] = my_title.Text;
ds.Tables["test"].Rows[e.RowIndex]["author"] = my_author.Text;

//最後把過後的值(DataSet)寫回真正的資料庫
myAdapter.Update(ds, "test");
//編輯退出
GridView1.EditIndex = -1;
//更新後記得在綁訂一次,才可以看到新值
DBInit();
}

//進入編輯模式觸發事件
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView1.EditIndex = e.NewEditIndex;
DBInit();
}

//分頁觸發事件
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
DBInit();
}

//取消編輯事件
protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridView1.EditIndex = -1;
DBInit();
}
//刪除事件
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
SqlConnection Conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["testConnectionString"].ConnectionString);
//從資料庫撈出這些資料
SqlDataAdapter myAdapter = new SqlDataAdapter("select id,title,author from test", Conn);

//選擇在刪除的那一行
myAdapter.DeleteCommand = new SqlCommand("delete from [test] where [id] = @id", Conn);
//抓取user點選的那一行的id並加密
myAdapter.DeleteCommand.Parameters.AddWithValue("@id", (int)GridView1.DataKeys[e.RowIndex].Value);

Conn.Open();
myAdapter.DeleteCommand.ExecuteNonQuery();
myAdapter.Dispose();

DBInit();
}

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 melomelo1988 的頭像
    melomelo1988

    melo 唐

    melomelo1988 發表在 痞客邦 留言(0) 人氣()