如何在SqlDataSource加载时读取数据并绑定FormView单选按钮
核心思路
不要在Page_Load中重复查询数据库,也无需使用SqlDataSource的Load事件(此时FormView模板内的控件尚未实例化,无法找到RadioButton),而是利用FormView的DataBound事件——这是FormView完成数据绑定后的触发时机,既能直接获取已加载的数据源数据,又能正常访问模板内的RadioButton控件。
修改步骤
1. 更新前端FormView代码
给FormView添加OnDataBound="FormView1_DataBound"事件:
<asp:FormView ID="FormView1" runat="server" DataSourceID="SqlDataSource1" DataKeyNames="MyRecordID" DefaultMode="Edit" OnItemUpdating="FormView1_ItemUpdating" OnDataBound="FormView1_DataBound"> <EditItemTemplate> <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="Update" /> <label>Options:</label> <asp:RadioButton ID="RadioButton1" runat="server" GroupName="Test1" Text='1' /> <asp:RadioButton ID="RadioButton2" runat="server" GroupName="Test1" Text='2' /> <asp:RadioButton ID="RadioButton3" runat="server" GroupName="Test1" Text='3' /> </EditItemTemplate> </asp:FormView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="MyConnString" SelectCommand="SELECT * FROM MYTABLE WHERE MYRECORDID=1" UpdateCommand="UPDATE MYTABLE SET [MYRECORDOPTION]=@MyRecordOption WHERE MYRECORDID=1" > <UpdateParameters> <asp:parameter Type="Int32" Name="MyRecordOption" /> </UpdateParameters> </asp:SqlDataSource>
2. 重构后台代码
- 删除Page_Load中重复查询数据库的代码
- 添加FormView_DataBound事件处理方法
- 保留原有的ItemUpdating写入逻辑
' 移除Page_Load中的数据库查询代码,仅保留非数据绑定的初始化逻辑 Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load End Sub ' FormView数据绑定完成后触发,设置RadioButton选中状态 Protected Sub FormView1_DataBound(sender As Object, e As EventArgs) Handles FormView1.DataBound ' 仅在Edit模式下处理 If FormView1.CurrentMode = FormViewMode.Edit Then ' 获取当前绑定的数据项 Dim dataItem As DataRowView = CType(FormView1.DataItem, DataRowView) If dataItem IsNot Nothing Then Dim optionValue As Integer = Convert.ToInt32(dataItem("MyRecordOption")) ' 找到模板内的RadioButton Dim rdo1 As RadioButton = CType(FormView1.FindControl("RadioButton1"), RadioButton) Dim rdo2 As RadioButton = CType(FormView1.FindControl("RadioButton2"), RadioButton) Dim rdo3 As RadioButton = CType(FormView1.FindControl("RadioButton3"), RadioButton) ' 根据字段值设置选中状态 Select Case optionValue Case 1 rdo1.Checked = True Case 2 rdo2.Checked = True Case 3 rdo3.Checked = True End Select End If End If End Sub ' 保留原有的更新逻辑 Protected Sub FormView1_ItemUpdating(ByVal Sender As Object, ByVal e As FormViewUpdateEventArgs) Handles FormView1.ItemUpdating Dim vRadioButton1 As RadioButton = CType(FormView1.FindControl("RadioButton1"), RadioButton) Dim vRadioButton2 As RadioButton = CType(FormView1.FindControl("RadioButton2"), RadioButton) Dim vRadioButton3 As RadioButton = CType(FormView1.FindControl("RadioButton3"), RadioButton) If vRadioButton1.Checked Then e.NewValues("MyRecordOption") = 1 ElseIf vRadioButton2.Checked Then e.NewValues("MyRecordOption") = 2 ElseIf vRadioButton3.Checked Then e.NewValues("MyRecordOption") = 3 End If End Sub
为什么不用SqlDataSource的Load事件?
SqlDataSource的Load事件触发时,FormView还未完成模板控件的实例化和数据绑定,此时调用FormView1.FindControl会返回Nothing,无法操作RadioButton控件。而FormView的DataBound事件是在控件完全绑定数据、模板内控件都已实例化后触发,是处理这类控件状态设置的最佳时机。
内容的提问来源于stack exchange,提问作者ptownbro
相关产品推荐
相关产品推荐

