所有数据均正确显示。只有“更新”链接不起作用。我的代码是:
<asp:SqlDataSource runat="server" ConnectionString="<%$ ConnectionStrings:DefaultConnection %>"
DataSourceMode="DataReader" ID="DataFrom"
SelectCommand="SELECT * FROM Classes" DeleteCommand="DELETE FROM Classes WHERE Id=@Id"
UpdateCommand="UPDATE Classes SET Password=@Password, Name=@Name WHERE Id=@Id">
<DeleteParameters><asp:Parameter Name="Id" /></DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="Id" />
<asp:Parameter Name="Password" Type="String" /><asp:Parameter Name="Name" Type="String" />
</UpdateParameters>
</asp:SqlDataSource>
<asp:GridView runat="server" ID="Main" DataSourceID="DataFrom" AutoGenerateColumns="false" AllowSorting="True" DataKeyNames="Id,Password,Name"
AutoGenerateDeleteButton="True" AutoGenerateEditButton="True" AutoGenerateSelectButton="False">
<Columns>
<asp:BoundField DataField="Id" HeaderText="Class ID" InsertVisible="False" ReadOnly="True" />
<asp:BoundField DataField="Password" HeaderText="Password" />
<asp:BoundField DataField="Name" HeaderText="Name" />
</Columns>
</asp:GridView>
最佳答案
您必须注意以下几点:
GridView 和数据源永远不允许更改
DataKeyNames
属性中指定的列。不要尝试更新主键列。这是不允许的。虽然单击更新时不会显示错误,但如果检查数据库中的值,则不会应用更改。
确保您的更新命令没有尝试为主键设置新值。因此,如果您尝试设置主键,完整的更新命令将被拒绝。即,即使其他非主键列也不会改变。因此,如果
Id
是主键,并且为Id
指定新值,则以下更新命令将被拒绝:UpdateCommand="更新类 SET Id=@Id,Password=@Password,Name=@Name WHERE Id=@Id"
所以在你的情况下,我猜,Id
必须是一个primaryKey。将属性 DataKeyNames 设置为:
DataKeyNames="Id".
因为,您想要更新名称和密码,所以不要将它们包含在 DataKeyNames 中。重要的是,通常您应该只提及 DatKeyNames
属性中的 PrimaryKey。
UpdateCommand 的其余部分完全没问题。
关于asp.net - 绑定(bind)到 SqlDataSource 的 GridView 控件不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17869079/