首先來回憶一下頁面上的配置
主要要寫的事件有 新增 修改 刪除 三個功能鍵
新增事件為 將上方輸入的資料 加入至 Gridview 中
修改事件為 將資料放至上方輸入框中 再按下上方的 新增 鍵 修改其資料
刪除事件為 將 Gridview 中該列資料給刪除 (廢話
先看來 新增 的按鈕事件
由上面所述可得知 這個按鈕會觸發 新增 及 修改 兩個事件
首先 建立 DataTable 當 Gridview 的 DataSource 來源
接著這段是從目前的 Gridview 中把資料抓到 DataTable 中
這邊可以看出坎尼的動作很簡單
Gridview資料->DataTable->增刪改->指定給 Gridview
另外 坎尼用 CommandArgument 的有無 判斷目前的狀態為何
可以看到 CommandArgument 記錄的是 order 只要減1就是 RowIndex
index 相同時 則把上方修改過的資料填入 DataTable 中
否則把 Gridview 裡的資料取出來填入 DataTable 中
這邊會看到坎尼都會加上 Replace("& nbsp;" , "") 這段
這是因為 Gridview 資料繫結後 會在資料上加入個空白
以防沒有繫結時 Table 表格該格的顯示上會不好看
(想試的人可以把 replace 這段拿掉 看回填的資料長怎樣)
接下來還是同一個事件喔 其實看註解就差不多了 (逃
接著來看修改按鈕的事件 (謎:你還真的跳過不講了)
其實這個事件是和上面的 btnAdd_Click 事件有關
當按下 Gridview 上的修改按鈕時 會先把原資料導到上方
所以這裡就是先利用 CommandArgument 找到該列的資料
再將資料填入上方的 資料輸入裝置組 (好像樂高玩具的感覺
剩下的步驟就是由 btnAdd_Click 去判斷是否為更新資料了
最後就是刪除資料
這裡比較單純 只是 Gridview 把資料回填到 DataTable 時 跳過該列即可
以下是執行畫面
修改前 有人發現坎尼
(這邊可以看到 原本的 新增 鍵的文字改為 修改)
修改後 坎尼的資料確實被修改了 (新增鍵的文字又改回來了)
編資料的人對坎尼很不滿 想要直接刪除坎尼的資料
按下確定後 坎尼就蒸發消失了
這邊要注意順序不會因有人被刪除而亂掉
而是將後面的人序號往前推
最後把資料存入資料庫這段坎尼就不寫了
流程是 從Gridview取得資料 -> ADO.NET
以前有看過同學寫過 在某個頁面 要加入新的人員資料
那時同學是放個 "新增" 按鈕 按一下就跳出一組資料輸入 (上圖的資料輸入裝置)
要多幾個人就按幾下 儲存時還要判斷資料有沒有填入
雖然動態抓控制項沒有說很難 但不符合坎尼的風格 囧興
現在用這種作法雖然程式碼煩人了一點
但在畫面的呈現上坎尼是覺得好很多
補了兩篇回來 不過這週 Tim 抓狂的放了好多篇
等坎尼案子趕完再來追一下篇數 XDDD
最後補上個 source code 下載
5 則留言:
不好意思,我想請問一下。
我是在gridview裡面做修改資料後想回存到資料庫,但我不知道如何去回存,可以麻煩交一下嗎?
hi 匿名,
修改後存回到資料庫的重點是「有哪些資料被修改」「哪筆資料被修改」
所以這部分就是先抓修改的 textbox id,然後再抓 hidden 之類的物件存的 unique id,再送回資料進行 update
大概就是這樣
看過這篇文章對於DataTable的應用有了初步的了解,但在嘗試將寫在gridView資料,存到資料庫時卻一直無法成功,不知道能不能麻煩坎尼老師,能講解一下這個問題,真的十分感謝
Hi HsinYuan,
對資料庫的處理牽涉太廣,有太多層面要考量
坎尼就大方向給你的建議是:
1) 取得目前的 GridView 資料
2) 取得資料庫的資料
3) 比對資料差異
(可能要兩個 for,或是有更簡單的方式要等坎尼研究看看,印象中 DataAdapter 有提供相對應的方法)
4) 用 DataAdapter.Update 進行大量更新
以上步驟供你參考
這篇範例是好久之前寫的,當時很多都是 hard code 硬寫出來的功能,實際上架構和程式碼都沒有很漂亮
坎尼打算再重新寫一篇類似的範例:功能流程相同,但程式碼更簡潔,也會附上和 DB 溝通的程式碼,到時會再分享出來 :D
我後來自己看了看,終於寫出來了!!
SqlDataAdapter da = new SqlDataAdapter();
da.InsertCommand = new SqlCommand("insert into ..(....) values(@...)", Conn);
for (int i = 0; i < Show_TreatmentPrograms.Rows.Count; i++)
{
da.InsertCommand.Parameters.Add("@..", SqlDbType.NVarChar, -1);
da.InsertCommand.Parameters["@.."].Value = gv.Rows[i].Cells[1].Text;
da.InsertCommand.Parameters.Add("@..", SqlDbType.Int, 4);
da.InsertCommand.Parameters["@.."].Value = gv.Rows[i].Cells[2].Text;
da.InsertCommand.ExecuteNonQuery();
da.Dispose();
}
踏蓋這樣QQ 感謝你的回答喔!! 真的幫助很大ㄒㄒ
張貼留言