【问题标题】:My GridView control bound to a SqlDataSource does not update我绑定到 SqlDataSource 的 GridView 控件不更新
【发布时间】:2013-07-25 23:58:31
【问题描述】:

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

<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 中自动生成的更新链接。

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


【解决方案1】:

您必须注意以下几点:

  • GridView 和 DataSource 不允许更改 DataKeyNames 属性中指定的列。

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

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

    UpdateCommand="更新类 SET Id=@Id,Password=@Password,Name=@Name WHERE Id=@Id"

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

DataKeyNames="Id".

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

您的 UpdateCommand 的其余部分完全没问题。

【讨论】:

  • 注意:将更新命令更改为 "UPDATE Classes SET Password='newPass', Name=@Name WHERE Id=@Id" 将密码正确更新为 newPass。
  • 嘿human44,我已经编辑了我的答案。请立即检查。感谢您的回复。
猜你喜欢
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多