【问题标题】:How can I prevent the selection of all radio buttons in radio button lists that have the same ID value?如何防止选择具有相同 ID 值的单选按钮列表中的所有单选按钮?
【发布时间】:2021-05-11 15:20:34
【问题描述】:

我有多个单选按钮列表。它们中的每一个都显示在更改的下拉列表索引中。我的问题是,当我从特定单选按钮列表中选择一个单选按钮时,所有其他单选按钮列表都选择了自己的单选按钮,这些单选按钮与我选择的单选按钮具有相同的 ID 值。 所以当我选择一个时,所有其他人都选择他们自己的。 我正在使用 Vb.NET Web 表单,我将单选按钮列表设置为自动回发,并且它们是动态创建的。 当我创建一个唯一 ID 时,它不允许我选择,所以当我选择它时,不会选择单选按钮。

【问题讨论】:

  • 不要使用相同的 ID。 ID 的全部意义在于它应该是唯一的。具有相同 ID 的两个字段被认为是同一个字段,因此选择一个会选择同一字段的所有其他实例。

标签: asp.net vb.net visual-studio visual-studio-2010 vb.net-2010


【解决方案1】:

这也许是既定目标更有价值的情况之一。

您没有提及或注明您的数据来自哪里。

假设我有一个酒店列表。我想要一个酒店“评级”的单选按钮列表。

好吧,在表单设计器中 - 放入网格视图中。生成列。 (然后从标记中删除该数据源。并在属性表中删除 dataSource1 设置。

好的,到目前为止?这大约是 2 分钟的时间。

现在,放入一个单选按钮列表。 (有时我将它放在网格外的表单上。选择单选列表,然后添加选项(0-5 级)。

现在将该单选按钮列表移动到网格视图中。您必须将其包裹在项目模板周围。

所以请注意我大部分时间是如何在这里使用构建器的。 (即使对于单选按钮列表中的选择,我也使用了设计器的构建器)。

好的,现在我们的标记如下所示:

<br />
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
            ReadOnly="True" SortExpression="ID" />
        <asp:BoundField DataField="HotelName" HeaderText="HotelName" SortExpression="HotelName" />
        <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />

        <asp:TemplateField HeaderText="Rating For Hotel">
            <ItemTemplate>
            <asp:RadioButtonList ID="RadioButtonList2" runat="server" RepeatDirection="Horizontal" 
                SelectedValue = '<%# Bind("Rating") %>'
                >
                <asp:ListItem Value="0">No Rating</asp:ListItem>
                <asp:ListItem Value="1">Poor</asp:ListItem>
                <asp:ListItem Value="2">Fair</asp:ListItem>
                <asp:ListItem Value="3">Good</asp:ListItem>
                <asp:ListItem Value="4">Excellent</asp:ListItem>
            </asp:RadioButtonList>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Update Choices" />
<br />

到目前为止?这已经接近所有拖放。如前所述,我使用了这样的 RadioButton 列表生成器:

然后我添加了我的选择:

如前所述,我按照上面的方法将该单选按钮列表剪切+粘贴到网格中。

现在,在我的加载中,我有这个代码:

   If IsPostBack = False Then

        Dim strSQL As String = "SELECT TOP 10 ID, HotelName, City, Rating from tblHotels ORDER BY HotelName"

        Dim cmdSQL As New SqlCommand(strSQL, New SqlConnection(My.Settings.Test3))
        cmdSQL.Connection.Open()

        GridView1.DataSource = cmdSQL.ExecuteReader
        GridView1.DataBind()
        GridView1.Columns(0).Visible = False

        cmdSQL.Connection.Close()
        Session("cmd") = cmdSQL

    End If

现在我明白了:

想想这是多么容易。 到目前为止,我只写了大约 7 行代码。

现在用户可以更改/选择单选按钮设置。

我现在如何将行更新回数据库?

嗯,更新按钮将如下所示:

    Dim dr As GridViewRow
    Dim cmdSQL As SqlCommand = Session("cmd")
    cmdSQL.Connection.Open()

    Dim rst As New DataTable
    rst.Load(cmdSQL.ExecuteReader)

    For Each dr In GridView1.Rows
        Dim rbL As RadioButtonList = dr.FindControl("RadioButtonList2")
        rst.Rows(dr.RowIndex).Item("Rating") = rbL.SelectedValue
    Next

    Dim daUpdate As New SqlDataAdapter(cmdSQL)
    Dim cmdUpdate As New SqlCommandBuilder(daUpdate)

    daUpdate.Update(rst)
    cmdSQL.Connection.Close()

    'cmdSQL.Dispose()

所以,这会将选择发送回数据库。

再次,看看这是多么少的代码和努力。

因此,您可能希望在用户在该单选按钮中做出选择后扩展您想要执行的操作。那么您想查看/检查这些值吗?

您要将选择发送回数据库吗?

正如您在上面看到的,我们真的不关心(或不需要)每个单选按钮列表的某些事件。

如果这是某种调查系统?然后我会再次从数据库中驱动选择。如果有 5 个答案或其他什么,则按上述显示结果。

记住,无论是列表视图、网格视图,还是作为“中继器”的控件块?

那么上面的代码模式就大同小异了。

现在,在上面我可以/可以触发单选按钮列表中给定选项的行事件 - 但此时我不相信这实际上是一个要求 - 但你可以获取/获取该事件如果您愿意,并对每一行采取行动,并作为选择单选按钮列表的结果(更改值)。

即使您的目标不是更新数据库并且有一个“N”(未知)选项列表,某些类型的数据网格或列表视图或数据重复器也会非常轻松地切分这个问题 - 并且如你所见?

我写的代码很少。而且我让 VS 和表单设计师为我编写了 99% 的标记 - 标记的手工编码很少 - 我让设计师和向导为我完成所有脏活。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多