ASP.Net中如何防止GridView编辑更新时只读列数据丢失?
GridView只读列更新后被设为NULL的解决办法
我在ASP.NET中使用GridView绑定SqlDataSource展示数据库Cart表的内容,仅允许用户编辑Amount列,因此将其余列都设置为ReadOnly="True"。测试时虽能正常编辑指定列,但更新提交后,那些只读列的数据会被替换为NULL写入数据库。尝试过处理RowEditing、RowUpdated、RowUpdating等事件,均未解决问题。
可行解决方案
修改SqlDataSource的更新查询语句,将不可修改的字段直接设为表中的原始值,仅保留可编辑的Amount列作为参数传入更新。
原GridView代码
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" Align="center" Height="138px" Width="548px" BorderColor="#6600FF" BorderStyle="Ridge" HorizontalAlign="Center" DataKeyNames="Id" DataSourceID="SqlDataSource1" > <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> <Columns> <asp:CommandField ShowEditButton="True" /> <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True" SortExpression="Id" Visible="False" /> <asp:BoundField DataField="PhoneName" HeaderText="PhoneName" SortExpression="PhoneName" ReadOnly="True" /> <asp:BoundField DataField="Amount" HeaderText="Amount" SortExpression="Amount" /> <asp:BoundField DataField="Price" HeaderText="Price" SortExpression="Price" ReadOnly="True" /> <asp:BoundField DataField="TotalPrice" HeaderText="TotalPrice" SortExpression="TotalPrice" ReadOnly="True" /> </Columns> <EditRowStyle BackColor="#999999" /> <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> <SortedAscendingCellStyle BackColor="#E9E7E2" /> <SortedAscendingHeaderStyle BackColor="#506C8C" /> <SortedDescendingCellStyle BackColor="#FFFDF8" /> <SortedDescendingHeaderStyle BackColor="#6F8DAE" /> </asp:GridView>
修改后的SqlDataSource代码
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="*connection string here*" ProviderName="System.Data.SqlClient" SelectCommand="SELECT * FROM [Cart]" DeleteCommand="DELETE FROM [Cart] WHERE [Id] = @original_Id" InsertCommand="INSERT INTO [Cart] ([PhoneName], [Amount], [Price], [TotalPrice]) VALUES (@PhoneName, @Amount, @Price, @TotalPrice)" OldValuesParameterFormatString="original_{0}" UpdateCommand="UPDATE [Cart] SET [PhoneName] = PhoneName, [Amount] = @Amount, [Price] = Price, [TotalPrice] = TotalPrice WHERE [Id] = @original_Id" DataSourceMode="DataReader"> <DeleteParameters> <asp:Parameter Name="original_Id" Type="Int32" /> </DeleteParameters> <InsertParameters> <asp:Parameter Name="PhoneName" Type="String" /> <asp:Parameter Name="Amount" Type="Int32" /> <asp:Parameter Name="Price" Type="String" /> <asp:Parameter Name="TotalPrice" Type="String" /> </InsertParameters> <UpdateParameters> <asp:Parameter Name="PhoneName" Type="String" /> <asp:Parameter Name="Amount" Type="Int32" /> <asp:Parameter Name="Price" Type="String" /> <asp:Parameter Name="TotalPrice" Type="String" /> <asp:Parameter Name="original_Id" Type="Int32" /> </UpdateParameters> </asp:SqlDataSource>
原理说明
问题根源在于:即使将列设为ReadOnly="True",SqlDataSource仍会将这些列的空值(编辑模式下只读列无输入控件,参数值为空)传入默认的Update语句,导致更新时覆盖原有数据为NULL。修改UpdateCommand后,只读字段直接引用表自身的字段值,不会被参数的空值覆盖,仅更新需要编辑的Amount列。
内容的提问来源于stack exchange,提问作者Con
相关产品推荐
相关产品推荐

