【问题标题】:Cannot Edit Rows in GridView Control无法在 GridView 控件中编辑行
【发布时间】:2019-03-20 01:32:51
【问题描述】:

我正在尝试将 2 个表的数据从 Microsoft SQL Server 检索到 GridView 控件。到目前为止,我能够在 GridView 控件中显示我想要的任何内容。但是,我想让用户可编辑,我有一个小问题

这是我的GridView控件源代码如下:

<asp:GridView ID="GridView1" runat="server" CssClass="auto-style36" AllowPaging="True" AutoGenerateColumns="False" 
        BackColor="#DEBA84" BorderColor="#DEBA84" BorderStyle="None" BorderWidth="1px" CellPadding="3" 
        CellSpacing="2" DataSourceID="SqlDataSource1" DataKeyNames="SID">
        <Columns>
            <asp:CommandField ShowEditButton="True" />
            <asp:BoundField DataField="SID" HeaderText="Student ID" ReadOnly="True" SortExpression="SID" />
            <asp:BoundField DataField="S_FName" HeaderText="First Name" SortExpression="S_FName" />
            <asp:BoundField DataField="S_LName" HeaderText="Last Name" SortExpression="S_LName" />
            <asp:BoundField DataField="Atd_Date" HeaderText="Date" SortExpression="Atd_Date" />
            <asp:BoundField DataField="Atd_InTime" HeaderText="In Time" SortExpression="Atd_InTime" />
            <asp:BoundField DataField="Atd_OutTime" HeaderText="Out Time" SortExpression="Atd_OutTime" />
            <asp:BoundField DataField="Atd_Comment" HeaderText="Comment" SortExpression="Atd_Comment" />
            <asp:BoundField DataField="Status" HeaderText="Status" SortExpression="Status" />
        </Columns>
        <FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
        <HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
        <PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
        <RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
        <SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
        <SortedAscendingCellStyle BackColor="#FFF1D4" />
        <SortedAscendingHeaderStyle BackColor="#B95C30" />
        <SortedDescendingCellStyle BackColor="#F1E5CE" />
        <SortedDescendingHeaderStyle BackColor="#93451F" />
    </asp:GridView>

正如您在上面看到的,我正在使用 SqlDataSource1 将数据检索到 GridView:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:SAOS1ConnectionString %>" 
        SelectCommand="SELECT attendance.Atd_Date, attendance.Atd_InTime, attendance.Atd_OutTime, attendance.Atd_Comment, 
        attendance.Status, student.SID, student.S_FName, student.S_LName FROM student LEFT OUTER JOIN attendance ON student.SID = attendance.SID 
        AND attendance.Atd_Date = @Atd_Date LEFT OUTER JOIN class ON student.CID = class.CID WHERE (class.CID = @CID)" 
        UpdateCommand="updatetable1" UpdateCommandType="StoredProcedure">
        <SelectParameters>
            <asp:ControlParameter ControlID="datepicker" Name="Atd_Date" PropertyName="Text" />
            <asp:ControlParameter ControlID="LabelClassID" Name="CID" PropertyName="Text" />
        </SelectParameters>
        <UpdateParameters>
            <asp:Parameter Name="Atd_ID" Type="Int32" />
            <asp:Parameter DbType="Date" Name="Atd_Date" />
            <asp:Parameter DbType="Time" Name="Atd_InTime" />
            <asp:Parameter DbType="Time" Name="Atd_OutTime" />
            <asp:Parameter Name="Atd_Comment" Type="String" />
            <asp:Parameter Name="Status" Type="String" />
            <asp:Parameter Name="SID" Type="Int32" />
            <asp:Parameter Name="S_FName" Type="String" />
            <asp:Parameter Name="S_LName" Type="String" />
        </UpdateParameters>
    </asp:SqlDataSource>

对于 UPDATE 语句,我使用名为 updatetable1 的 Stored Procured:

    CREATE PROCEDURE [dbo].[updatetable1]
(
    @Atd_ID int,
    @Atd_Date date,
    @Atd_InTime time(7),
    @Atd_OutTime time(7),
    @Atd_Comment varchar(50),
    @Status varchar(50),
    @SID int,
    @S_FName varchar(50),
    @S_LName varchar(50)
)
AS
BEGIN
UPDATE attendance SET Atd_Date=@Atd_Date, Atd_InTime=@Atd_InTime, Atd_OutTime=@Atd_OutTime, Atd_Comment=@Atd_Comment, Status=@Status where Atd_ID=@Atd_ID
UPDATE student SET S_FName=@S_FName, S_LName=@S_LName WHERE SID=@SID
END
RETURN

当我在 GridView 中单击 Edit link 时,表 student 中的列(例如 SID、S_FName 和 S_LName)已成功更新。

但表 attendance 中的其余列无法成功更新。更改保持不变。请帮忙

【问题讨论】:

  • 您的结果集不包含Atd_ID,因此没有有效值可传递给存储过程。
  • @SeanLange 我想让表 attendance 中的所有列都可供用户编辑。你是什​​么意思只更新两列?我在 SP 中设置了多个列,对吗?
  • @Crowcoder 但我不能真正更新列 Atd_ID 因为它是一个标识列
  • 想一想,数据源如何知道要向更新命令发送什么id?我认为您需要做的就是将 Atd_ID 添加到 select 语句中:SelectCommand="SELECT attendance.Atd_ID, attendance.Atd_Date, ......
  • 您可能还需要将其添加到 DataKeyNames。我不记得 WebForms 的细节(或者我会写一个答案),但我可以看到你的命令无法知道要使用什么 id。

标签: c# asp.net sql-server stored-procedures gridview


【解决方案1】:

根据GridView 的定义,有一个名为DataKeyNames 的属性,您可以在其中设置关键字段的名称,该字段可以自动更新/删除其中包含的行。以下是来自DataKeyNames property的简要说明:

您应该只将此属性设置为一个或多个字段 需要唯一标识每一行;例如,如果 ID 列 一个整数值唯一标识每一行。您必须设置 DataKeyNames 属性以便自动更新和删除 GridView 控件的功能。

根据当前GridView 状态,您可能需要attendancestudent 表的主键和外键来启用自动更新,如上所述:

<asp:GridView ID="GridView1" runat="server" CssClass="auto-style36" AllowPaging="True" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" 
              DataKeyNames="Atd_ID,SID" ...>
</asp:GridView>

还要记得将Atd_ID作为attendance表的主键添加到SqlDataSource的结果集中:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:SAOS1ConnectionString %>"
            SelectCommand="SELECT attendance.Atd_ID, ..., student.SID, ..." 
            UpdateCommand="updatetable1" UpdateCommandType="StoredProcedure">
</asp:SqlDataSource>

【讨论】:

    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多