编辑命令上的FormView逻辑错误-总是跳转回第一个记录

本文关键字:记录 第一个 错误 命令 FormView 编辑 | 更新日期: 2023-09-27 18:16:48

我有一个逻辑错误,我一直在努力修复。这是我的情况:我正在开发。net 4.0。你有一个绑定到SQLDataSource的FormView控件。此外,我还有一个下拉列表,我用它作为一个选项来过滤FormView的记录。DropDownList还绑定到SQLDataSource。我的问题是,当FormView不是通过下拉列表过滤,它的行为如预期的,但一旦我从下拉列表中选择一个过滤器,它的行为在一个奇怪的方式。我的代码将遵循这一描述。每当编辑按钮被点击,FormView总是跳回到第一个记录,并打开它进行编辑,不管我选择了哪个记录。可能是我做错了什么小事,希望你能帮助我。

澄清一下:我有一个下拉列表如下:

    <asp:ComboBox ID="cboSearchApplicantName" runat="server" 
                    AutoCompleteMode="Suggest" DataSourceID="SearchApplicantDataSource" 
                    DataTextField="Name" DataValueField="ApplicantCode" DropDownStyle="DropDownList" 
                    MaxLength="0" style="display: inline;" AutoPostBack="True" 
                    onselectedindexchanged="cboSearchApplicantName_SelectedIndexChanged" AppendDataBoundItems="True">
                    <asp:ListItem Selected="True" Value="">(none)</asp:ListItem>
                </asp:ComboBox>

DropDownList的数据源如下:

    <asp:SqlDataSource ID="SearchApplicantDataSource" runat="server" 
                    ConnectionString="<%$ ConnectionStrings:Grads_tablesSQLContext %>" 
                    SelectCommand="Select ApplicantCode,UGStudentID,LastName + ' ' + FirstName as Name from Applicants">
                </asp:SqlDataSource>

在下拉列表的SelectedIndexChanged事件处理程序中,我重新定义了FormView的selectcommand,并将其重新绑定如下:

    stdCode = Convert.ToInt32(cboSearchApplicantName.SelectedValue);
        ApplicantSqlDataSource.SelectCommand = "Select * FROM Applicants WHERE ApplicantCode =" + stdCode;
        ApplicantFormView.DataBind();

不幸的是,我不能粘贴formview控件的定义,因为长模板定义和网站的Body Limit。但是,FormViews SqlDataSource在下面定义。

    <asp:SqlDataSource ID="ApplicantSqlDataSource" runat="server" 
        ConnectionString="<%$ ConnectionStrings:Grads_tablesSQLContext %>" 
        SelectCommand="SELECT * FROM [Applicants]" 
        UpdateCommand="UPDATE Applicants SET LastName=@LastName, FirstName=@FirstName, Sex=@Sex, DateOfBirth=@DateOfBirth, ApplicationCitizenshipStatus=@ApplicationCitizenshipStatus, 
                        InternationalCitizenship=@InternationalCitizenship, 
                        HomeUnit=@HomeUnit,ProgramType=@ProgramType,Program=@Program,EntrySemester=@EntrySemester, 
                        RegistrationClassification=@RegistrationClassification, Address1=@Address1, 
                        Address2=@Address2,City=@City, 
                        Province=@Province,PostCode=@PostCode, 
                        Country=@Country,PhonePermanent=@PhonePermanent,PhoneOther=@PhoneOther, 
                        Email=@Email 
                       WHERE ApplicantCode=@ApplicantCode" 
        InsertCommand="INSERT INTO Applicants(UGStudentID, LastName, FirstName, Sex, DateOfBirth, ApplicationCitizenshipStatus, InternationalCitizenship, 
                       HomeUnit, ProgramType, Program, EntrySemester, RegistrationClassification, Address1,  Address2, City, 
                        Province, PostCode, Country, PhonePermanent, PhoneOther, Email) 
                        VALUES (@UGStudentID, @LastName, @FirstName, @Sex, @DateOfBirth,@ApplicationCitizenshipStatus ,@InternationalCitizenship, 
                        @HomeUnit, @ProgramType, @Program, @EntrySemester, @RegistrationClassification, 
                        @Address1, @Address2, @City,  @Province, @PostCode, 
                        @Country, @PhonePermanent, @PhoneOther, @Email); 
                     SELECT @ApplicantCode = SCOPE_IDENTITY()" 
        DeleteCommand="DELETE Applicants WHERE ApplicantCode=@ApplicantCode" 
    oninserting="ApplicantSqlDataSource_Inserting" 
    onupdating="ApplicantSqlDataSource_Updating"> 
            <InsertParameters> 
        <asp:Parameter Name="ApplicantCode" Direction="Output" Type="Int32" DefaultValue="0" /> 
      </InsertParameters> 
        </asp:SqlDataSource>  

重申问题所在,当我通过选择我想要显示的记录重新填充FormView后单击编辑按钮时,它总是跳回第一个记录并打开它进行编辑。

编辑命令上的FormView逻辑错误-总是跳转回第一个记录

如果你能告诉我正确的方向,我将不胜感激。

我已经设法解决了我的问题。似乎这个问题源于FormView的SqlDataSource的选择命令,该命令覆盖了我在SelectedIndexChanged中的代码中定义的SelectCommand。为了解决这个问题,我没有在设计时为formview定义SqlDataSource,而是在后面的代码上创建一个SqlDataSource,并在需要时绑定到它。也就是说,我可以控制何时绑定以及绑定到什么查询或命令。这样做的缺点是,我必须为插入、更新和删除设置参数,而如果我定义了一个SqlDataSource,我只需定义它的选择命令、插入命令、更新命令和删除命令,然后就可以完成了。