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