iT邦幫忙

0

ASP.NET(VB) GridView 自訂樣板,編輯輸入資料,按下更新鈕後,剛才輸入的資料變成NULL值

我參考松崗專題實務I ASP.NET VB入門實戰 VS2015版 Chapter 08的內容,為敝公司(在東南亞)的半成品盤點系統網頁設置自訂樣板,讓user能選擇要把舊資料鎖定或解鎖。因只有兩種選擇,所以用了RadioButtonList的控制項,完全按照書中P8-25~P8-29的內容來設計網頁樣板。

但在執行後出現了錯誤的結果,請參考以下4張圖。我將控制項改為TextBox、DropDownList也是一樣的結果,不知是哪裡出了問題?還請各位先進不吝分享,謝謝!另外因為公司有時程壓力,沒時間讓我從頭學起,只能遇到問題時跳著閱讀及製作網頁,請原作者不要唸我觀念不清就要寫程式,我以前是搞IT硬體的,接觸ERP是這兩年的事,接觸ASP是從2017/11起,今年2018才開始接觸ASP.NET,公司裡做事就是趕鴨子上架,我會另外再找時間從頭學起,但現在要緊的是先解決眼前的問題,感恩感恩!

圖1,設計畫面https://ithelp.ithome.com.tw/upload/images/20180115/20108332ZxTGpmL2sm.png

圖2,執行畫面https://ithelp.ithome.com.tw/upload/images/20180115/20108332wQXBrg5fu7.png

圖3,編輯畫面https://ithelp.ithome.com.tw/upload/images/20180115/20108332yKTibvr1Ej.png

圖四,結果畫面https://ithelp.ithome.com.tw/upload/images/20180115/20108332jfX4h2la6Q.png

看更多先前的討論...收起先前的討論...
grande iT邦新手 5 級 ‧ 2018-01-15 11:30:36 檢舉
以下是這個控制項的原始碼,在這裡我不知如何縮排,有點亂,對大家的眼睛和腦袋不好意思

<asp:TemplateField HeaderText="锁定码" SortExpression="IV_CONFIRM">
<EditItemTemplate>
<asp:RadioButtonList ID="RadioButtonList1" runat="server" SelectedValue='<%# Bind("IV_CONFIRM") %>'>
<asp:ListItem Text="解锁(N)" Value="N"></asp:ListItem>
<asp:ListItem Text="锁定(Y)" Value="Y"></asp:ListItem>
</asp:RadioButtonList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("IV_CONFIRM") %>'></asp:Label>
<br />
<asp:RadioButtonList ID="RadioButtonList2" runat="server" SelectedValue='<%# Bind("IV_CONFIRM") %>'>
<asp:ListItem Value="N">解锁(N)</asp:ListItem>
<asp:ListItem Value="Y">锁定(Y)</asp:ListItem>
</asp:RadioButtonList>
</ItemTemplate>
<HeaderStyle Wrap="False" />
<ItemStyle HorizontalAlign="Center" Wrap="False" />
</asp:TemplateField>

<asp:CommandField ButtonType="Button" ShowEditButton="True" EditText="锁定 / 解锁">
<HeaderStyle Wrap="False" />
<ItemStyle Wrap="False" />
</asp:CommandField>
grande iT邦新手 5 級 ‧ 2018-01-15 11:35:12 檢舉
已搬到前一篇討論串
grande iT邦新手 5 級 ‧ 2018-01-15 11:39:36 檢舉
這是SqlDataSource的原始碼,Select沒有問題,主要問題出在Update:

<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:GRANDE_OAConnectionString %>"
SelectCommand="SELECT DISTINCT [IV_NO], [IV_CONFIRM] FROM [INVENPT] WHERE ([IV_NO] LIKE '%' + @IV_NO + '%');"
OldValuesParameterFormatString="original_{0}"

UpdateCommand="UPDATE [INVENPT] SET [IV_CONFIRM] = @RadioButtonList1 WHERE [IV_NO] = @original_IV_NO;">

<SelectParameters>
<asp:ControlParameter ControlID="GridView1" Name="IV_NO" PropertyName="SelectedValue" Type="String" />
</SelectParameters>

<UpdateParameters>
<asp:Parameter Name="RadioButtonList1" Type="String" />
<asp:Parameter Name="original_IV_NO" Type="String" />
</UpdateParameters>

</asp:SqlDataSource>
grande iT邦新手 5 級 ‧ 2018-01-15 12:01:33 檢舉
另外我把Update SQL command裡的
SET [IV_CONFIRM] = @RadioButtonList1
改為
SET [IV_CONFIRM] = 'Y'
值就可以順利寫入Table的IV_CONFIRM欄位,表示原因出在@RadioButtonList1沒有取得編輯時輸入的新值,這就是我無法理解的部分,明明已經做好DataBinding了

2 個回答

0
海綿寶寶
iT邦超人 1 級 ‧ 2018-01-15 11:23:08

錯誤訊息是「GRANDE_OA.dbo.INVENPT 的 IV_CONFIRM 不得為 NULL」
所以有兩種情形:
1.IV_CONFIRM 不是解鎖/鎖定欄位
檢查為什麼 IV_CONFIRM 是空值
2.IV_CONFIRM 就是解鎖/鎖定欄位
參考同頁面/同資料表的其他欄位寫法
確定 IV_CONFIRM 和 解鎖/鎖定 欄位有「串」在一起

另外
你說「我會另外再找時間從頭學起」
我猜

grande iT邦新手 5 級 ‧ 2018-01-15 11:29:06 檢舉

謝謝大大的回覆,我也知道傳了空值過去,但就是不知原因為何。
另外大大猜的99.999%正確,從頭學起是理想,但人不能沒有理想。

小魚 iT邦研究生 2 級 ‧ 2018-01-15 12:08:10 檢舉

從頭學起很簡單,
下班回來就花自己的時間從頭學吧.
如果你現在還沒開始,
那我想之後也不會開始了.

grande iT邦新手 5 級 ‧ 2018-01-15 13:00:51 檢舉

目標分長短期分開處理,先解決燃眉之急吧!

0
小魚
iT邦研究生 2 級 ‧ 2018-01-15 23:47:50

我看不出@RadioButtonList1 跟 @original_IV_NO 的值從哪來?

看更多先前的回應...收起先前的回應...
grande iT邦新手 5 級 ‧ 2018-01-16 08:56:50 檢舉

謝謝大大的回應,在EditItemTemplate內有一個名為RadioButtonList1的控制項,@RadioButtonList1的值來自於該控制項,我在主題底下第一個補充有貼出樣版內控制項的原始碼。

原本大大提出這個疑惑,我也有點動搖,於是特地再檢查一番,發現有另一個(沒貼出來)修改數量的樣版使用的是TextBox控制項,它可以正常修改,不會變成空值。同樣在它的update parameter裡只有如下的原始碼,並未給值,所以我想程式是否根據控制項名稱自動去取值?
<asp:Parameter Name="IV_SL" Type="Decimal" />

小魚 iT邦研究生 2 級 ‧ 2018-01-16 12:02:46 檢舉

RadioButtonList1的值應該不會自動傳給@RadioButtonList1,
可以參考一下Select那邊的用法,
我好奇的是你original_IV_NO的值取得到??
因為你說 SET [IV_CONFIRM] = 'Y' WHERE [IV_NO] = @original_IV_NO; 可以用??

grande iT邦新手 5 級 ‧ 2018-01-16 16:43:10 檢舉

是的, SET [IV_CONFIRM] = 'Y' WHERE [IV_NO] = @original_IV_NO; 可以用,沒有錯誤訊息,被選擇的資料,其[IV_CONFIRM]的欄位值也從 N 改成了 Y

小魚 iT邦研究生 2 級 ‧ 2018-01-16 23:52:33 檢舉

這一篇 應該會對你有幫助
遇到問題記得先Google

grande iT邦新手 5 級 ‧ 2018-01-17 15:37:55 檢舉

謝謝!我再好好研究研究。

我要發表回答

立即登入回答