为什么我的GridView没有更新?
问题描述:
我试图更新'问题'字段,当我点击'更新'按钮的特定行。当我点击'编辑'按钮时,我可以改变文本,但是当我点击'更新'按钮时,它会恢复到原来的值。数据库中也没有任何变化。为什么我的GridView没有更新?
这里是我的标记:
<div class="divGrid" style="margin: 0 auto; width: 70%;">
<asp:GridView ID="QuestionsGridView" CssClass="gridView" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" Width="100%" CellPadding="4" ForeColor="#333333">
<Columns>
<asp:BoundField DataField="QUESTION_NUMBER" ReadOnly="true" HeaderText="Question Number" SortExpression="QUESTION_NUMBER" ItemStyle-HorizontalAlign="Center" HeaderStyle-HorizontalAlign="Center" />
<asp:TemplateField HeaderText="Question" SortExpression="QUESTION" HeaderStyle-HorizontalAlign="Center">
<EditItemTemplate>
<asp:TextBox ID="EditQuestionBox" runat="server" Height="50px" Text='<%# Bind("QUESTION") %>' TextMode="MultiLine" Width="99%" CssClass="multilineTBox" Columns="1" Rows="2"></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("QUESTION") %>'></asp:Label>
</ItemTemplate>
<ControlStyle Width="99%" />
</asp:TemplateField>
<asp:BoundField DataField="CAT_NAME" ReadOnly="true" HeaderText="Category" SortExpression="CAT_NAME" HeaderStyle-HorizontalAlign="Center" />
<asp:BoundField DataField="QUES_ORDER" ReadOnly="true" HeaderText="Order in Category" SortExpression="QUES_ORDER" ItemStyle-HorizontalAlign="Center" HeaderStyle-HorizontalAlign="Center" />
<asp:CommandField CausesValidation="False" HeaderText="Edit" ShowEditButton="True" ControlStyle-Width="4em" ItemStyle-HorizontalAlign="Center" HeaderStyle-HorizontalAlign="Center" />
</Columns>
<EditRowStyle BackColor="#2461BF" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#a0a0a0" Font-Bold="True" ForeColor="White" BorderStyle="Solid" BorderColor="Black" BorderWidth="1px" HorizontalAlign="Center" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#ffffff" BorderStyle="Solid" BorderColor="Black" BorderWidth="1px" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#F5F7FB" />
<SortedAscendingHeaderStyle BackColor="#6D95E1" />
<SortedDescendingCellStyle BackColor="#E9EBEF" />
<SortedDescendingHeaderStyle BackColor="#4870BE" />
</asp:GridView>
</div>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Corp_TaxConnectionString %>"
SelectCommand="SELECT tq.id, tq.question, tq.ques_order, tc.cat_name, tq.question_number FROM t01_tax_questions AS tq INNER JOIN t01_tax_categories AS tc ON tq.category = tc.cat_order ORDER BY tq.question_number"
UpdateCommand="UPDATE t01_tax_questions SET question = @question WHERE question_number = @question_number">
<UpdateParameters>
<asp:Parameter Name="question_number" Type="Int32" />
<asp:Parameter Name="question" Type="String" />
<asp:Parameter Name="id" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
而且表: SQLServer Table
编辑:
寻找后,在我的EditItemTemplate里,我绑定问题文本框。在点击更新按钮之后,在尝试更新之前,原始问题是否再次绑定到文本框,是否有可能?如果是这样的话,我将如何解决这个问题?
答
进一步研究之后,我意识到我忘记了GridView标签中显然非常重要的“DataKeyNames”属性。我感到非常愚蠢。这是新的工作代码。
<div class="divGrid" style="margin: 0 auto; width: 70%;">
<asp:GridView ID="QuestionsGridView" CssClass="gridView" runat="server" AutoGenerateColumns="False" Width="100%" DataKeyNames="ID, QUESTION_NUMBER" DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="question_number" HeaderText="Question Number" SortExpression="question_number" ReadOnly="True" ItemStyle-HorizontalAlign="Center" />
<asp:BoundField DataField="question" HeaderText="Question" SortExpression="question" >
<ControlStyle Width="100%" Height="80%" />
</asp:BoundField>
<asp:BoundField DataField="cat_name" HeaderText="Category" SortExpression="cat_name" ItemStyle-HorizontalAlign="Center">
<ControlStyle Height="80%" />
</asp:BoundField>
<asp:BoundField DataField="ques_order" HeaderText="Question Order" SortExpression="ques_order" ReadOnly="True" ItemStyle-HorizontalAlign="Center" />
<asp:CommandField HeaderText="Edit" ShowEditButton="True" CausesValidation="False" HeaderStyle-Width="4%" ItemStyle-HorizontalAlign="Center"/>
<asp:CommandField HeaderText="Delete" ShowDeleteButton="True" CausesValidation="False" HeaderStyle-Width ="4%" ItemStyle-HorizontalAlign="Center" />
</Columns>
<EditRowStyle BackColor="Yellow" Width="100%" />
<FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#a0a0a0" Font-Bold="True" ForeColor="White" BorderStyle="Solid" BorderColor="Black" BorderWidth="1px" HorizontalAlign="Center" />
<PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
<RowStyle BackColor="#ffffff" BorderStyle="Solid" BorderColor="Black" BorderWidth="1px" />
<SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
<SortedAscendingCellStyle BackColor="#F5F7FB" />
<SortedAscendingHeaderStyle BackColor="#6D95E1" />
<SortedDescendingCellStyle BackColor="#E9EBEF" />
<SortedDescendingHeaderStyle BackColor="#4870BE" />
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:Corp_TaxConnectionString %>" SelectCommand="SELECT
tq.id, tq.question_number, tq.question, tc.cat_name, tq.ques_order
FROM
t01_tax_questions AS tq
INNER JOIN
t01_tax_categories AS tc
ON
tq.category = tc.cat_order
ORDER BY tq.question_number"
DeleteCommand="DELETE
FROM
t01_tax_questions
WHERE
question_number = @question_number"
UpdateCommand="UPDATE
t01_tax_questions
SET
question = @question
WHERE
id = @id">
<DeleteParameters>
<asp:Parameter Name="@question_number" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="@question"/>
<asp:Parameter Name="@id" />
</UpdateParameters>
</asp:SqlDataSource>
正是在这种MSDN Documentation
所有解释谢谢所有谁看着这个和审判。
不知道是否这件事(不是太熟悉界面中的所有SQL)你的Gridview字段与你的sqldata源不同,这让我感到奇怪。编辑:MSDN链接 https://msdn.microsoft.com/en-us/library/z72eefad.aspx – Robin
是的,长篇故事在那里。但是,改变案例以使它们全都匹配似乎也不起作用。 –
这是新的代码吗?你自己写了这些吗?还是你支持现有的应用程序? – mason