绑定到SqlDataSource的我的GridView控件不会更新

时间:2013-07-25 21:29:59

标签: asp.net sql sql-server gridview sqldatasource

所有数据都正确显示。只有“更新”链接不起作用。我的代码是:

<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>

1 个答案:

答案 0 :(得分:2)

你必须注意以下几点:

  • GridView&amp;因此,DataSource永远不允许更改DataKeyNames属性中指定的列。

  • 不要尝试更新PrimaryKey列。这是不允许的。虽然单击更新时不会显示错误,但如果检查数据库中的值,则不会应用更改。

  • 确保您的更新命令未尝试为主键设置新值。因此,如果您尝试设置主键,则将拒绝完整的更新命令。即使其他非主键列也不会改变。因此,如果Id是主键,则如果您为Id指定新值,则会拒绝以下更新命令:

    UpdateCommand =“UPDATE Classes SET Id = @ Id,Password = @ Password,Name = @ Name WHERE Id = @ Id”

所以在你的情况下,我猜,Id必须是一个primaryKey。将属性DataKeyNames设置为:

DataKeyNames="Id".

因为,您要更新名称&amp;密码,所以不要将它们包含在DataKeyNames中。重要的是,通常你应该只提到DatKeyNames属性中的PrimaryKeys。

其余的UpdateCommand完全没问题。