You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SqlDataSource加载时读取数据并绑定FormView单选按钮

解决方案:FormView中单个RadioButton绑定数据库字段(避免重复查询)

核心思路

不要在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:42:37