2008年12月26日

直接操作 Gridview 上的 增刪改 (程式碼篇)

由於廢話 上一篇 都講的差不多了 直接進入程式碼的部分吧
首先來回憶一下頁面上的配置

主要要寫的事件有 新增 修改 刪除 三個功能鍵
新增事件為 將上方輸入的資料 加入至 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

大概就是這樣

Unknown 提到...

看過這篇文章對於DataTable的應用有了初步的了解,但在嘗試將寫在gridView資料,存到資料庫時卻一直無法成功,不知道能不能麻煩坎尼老師,能講解一下這個問題,真的十分感謝

坎尼 提到...

Hi HsinYuan,

對資料庫的處理牽涉太廣,有太多層面要考量
坎尼就大方向給你的建議是:
1) 取得目前的 GridView 資料
2) 取得資料庫的資料
3) 比對資料差異
(可能要兩個 for,或是有更簡單的方式要等坎尼研究看看,印象中 DataAdapter 有提供相對應的方法)
4) 用 DataAdapter.Update 進行大量更新

以上步驟供你參考

這篇範例是好久之前寫的,當時很多都是 hard code 硬寫出來的功能,實際上架構和程式碼都沒有很漂亮
坎尼打算再重新寫一篇類似的範例:功能流程相同,但程式碼更簡潔,也會附上和 DB 溝通的程式碼,到時會再分享出來 :D

Unknown 提到...

我後來自己看了看,終於寫出來了!!
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 感謝你的回答喔!! 真的幫助很大ㄒㄒ

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D