0

我正在 ASP.Net 中创建一个表单来复制纸质表单(我在设计中没有发言权,我的任务只是以数字方式重新创建它)。该表格有许多问题,例如“回答是或否。如果是,请指定多少”。我目前正在通过列出问题来处理它,然后在一个组中设置两个单选按钮,一个说“是”,一个说“否”。为了让它更漂亮一点,我一直在使用 Ajax 更新面板,如果用户选择 Yes,它只会显示一个文本框来保存这个 yes 值。

现在我已经能够成功地做到这一点,但是每个问题都是它自己的单选按钮组,并且有自己的面板来更新可见性,这意味着我目前这样做的方式有很多冗余代码,比如

Protected Sub rdoShowOriginalEquipment(ByVal sender As Object, ByVal e As System.EventArgs)
    If rdoOEYes.Checked = True Then
        pnlOriginalEquipment.Visible = True
    ElseIf rdoOENo.Checked = True Then
        pnlOriginalEquipment.Visible = False
    End If
End Sub

对于每个有类似是/否选项的问题,依此类推。我毫不怀疑有更好的方法来做到这一点。我想知道是否有一种方法可以传递与单选按钮组关联的面板,这样我就可以在代码中使用一个方法来触发所有单选按钮回发,例如(不是真正的代码)

Protected Sub showPanel(RadioButtonGroup, panel)
    If rdoYes.Checked = True Then
        panel.Visible = True
    ElseIf rdoNo.Checked = True Then
        panel.Visible = False
    End If
End Sub

或者有没有更好的方法来处理这样的问题?如果它可以减少我现在输入的冗余代码的数量,我愿意采用不同的方法。我正在使用 VB,但我知道 C#,所以如果有人能流利地回答这个问题,我就可以毫无问题地解释它。

任何帮助深表感谢。

4

1 回答 1

1

这是一个工作代码:

<asp:Panel ID="Question1" runat="server">
    <asp:RadioButton GroupName="Q1" runat="server" ID="Q1Yes" Text="Yes" OnCheckedChanged="AnswerChanged" AutoPostBack="true" />
    <asp:RadioButton GroupName="Q1" runat="server" ID="Q1No" Text="No" OnCheckedChanged="AnswerChanged" AutoPostBack="true" />
    <asp:Panel runat="server" ID="Q1Panel">Some text here</asp:Panel>
</asp:Panel>

<asp:Panel ID="Question2" runat="server">
    <asp:RadioButton GroupName="Q2" runat="server" ID="Q2Yes" Text="Yes" OnCheckedChanged="AnswerChanged" AutoPostBack="true" />
    <asp:RadioButton GroupName="Q2" runat="server" ID="Q2No" Text="No" OnCheckedChanged="AnswerChanged" AutoPostBack="true" />
    <asp:Panel runat="server" ID="Q2Panel">Some text here</asp:Panel>
</asp:Panel>

请注意,所有单选按钮都具有相同的 OnCheckedChanged 处理程序,并且它们的 AutoPostBack=True

您可以将 UpdatePanel 放在必要的地方

//后面的代码:

protected void AnswerChanged(object sender, EventArgs e)
{
    RadioButton rbAnswer = (RadioButton)sender;
    if (rbAnswer.Checked)
    { 
        string panelID = rbAnswer.GroupName + "Panel";
        if (rbAnswer.Text == "Yes")
                rbAnswer.Parent.FindControl(panelID).Visible = true;
         else
                rbAnswer.Parent.FindControl(panelID).Visible = false;
    }
}

您也可以使用 DataBound 控件(例如 GridView),但您的问题会有一个列表。

快乐编码

于 2012-05-29T15:08:22.737 回答