在gridview控件中使用单选按钮

时间:2011-07-08 16:41:42

标签: asp.net gridview controls radio-button

我有一个gridview控件,其中使用存储过程显示数据。网格有三列,第一列包含radiobuttons。一般的想法是,用户应该只能从(在我的情况下)5个radiobuttons中选择一个radiobutton。

本功能的问题在于我可以同时选择所有的无线电按钮。我尝试使用'groupname'属性对radiobuttons进行分组..它不起作用。

我该如何解决?

这是gridview控件

<asp:GridView UseAccessibleHeader="true" ID="GridView1" CssClass="top" EmptyDataText="" HeaderStyle-CssClass="griditem_heading" HeaderStyle-BackColor="" runat="server" AllowSorting="True" AutoGenerateColumns="False" CellPadding="0" Width="100%">
<EmptyDataRowStyle />
<EmptyDataTemplate>
    <table cellspacing="0" cellpadding="0" border="0" id="dgd_Clinic_empty" width="100%">
        <tr>
            <td valign="Middle" align="Center" bgcolor="#cce57f" class="griditem_1">
                <span class="smalltableheading">&nbsp;&nbsp;&nbsp;</span>
            </td>
            <td valign="Middle" align="Center" bgcolor="#cce57f" class="griditem_1">
                <span class="smalltableheading">Clinic Name</span>
            </td>

            <td valign="Middle" align="Center" bgcolor="#cce57f" class="griditem_1">
                <span class="smalltableheading">Open</span>
            </td>
      </tr>
        <tr>
            <td colspan="8" align="Center">
                <span class="Content"><b>No matching records were found.</b></span>
            </td>
        </tr>
    </table>
</EmptyDataTemplate>
<Columns>
    <asp:TemplateField HeaderText="" HeaderStyle-CssClass="griditem_heading" ItemStyle-CssClass="griditem_1"
        HeaderStyle-HorizontalAlign="Center" HeaderStyle-VerticalAlign="Middle" SortExpression=""
        Visible="True" ItemStyle-VerticalAlign="Middle" ItemStyle-HorizontalAlign="Center">
        <ItemTemplate>
        <asp:Label for="rad1_1" ID="rad1_1" runat="server" Visible="false"> </asp:Label>                
            <asp:RadioButton ID="rdoClinicId" runat="server"  />                                  
         </ItemTemplate>                
    </asp:TemplateField>       
        <asp:TemplateField HeaderText="Clinic Name" HeaderStyle-CssClass="griditem_heading"
        ItemStyle-CssClass="griditem_1" HeaderStyle-HorizontalAlign="Center" HeaderStyle-VerticalAlign="Middle"
        SortExpression="clinic_name" Visible="True" ItemStyle-VerticalAlign="Middle" ItemStyle-HorizontalAlign="Center">
        <ItemTemplate>
            <asp:Label ID="lbl_Grd_Clinic_Name" runat="Server" Text="" ToolTip="" Width="" Height=""
                Style="" />                 
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Open" HeaderStyle-CssClass="griditem_heading"
        ItemStyle-CssClass="griditem_1" HeaderStyle-HorizontalAlign="Center" HeaderStyle-VerticalAlign="Middle"
        SortExpression="Open" Visible="True" ItemStyle-VerticalAlign="Middle"
        ItemStyle-HorizontalAlign="Center">
        <ItemTemplate>
              <asp:Label ID="lbl_Grd_Open" runat="Server" Text="" ToolTip="" Width="" Height="" Style="" />                    
        </ItemTemplate>
    </asp:TemplateField>

</Columns>
</asp:GridView>

4 个答案:

答案 0 :(得分:5)

由于 gridview呈现为表元素,因此在运行时它会为每个单选按钮分配不同的“名称”,使GroupName不起作用。

但调用JavaScript函数验证单选按钮一次选择一个单选按钮,而不是为gridview外的多个单选按钮提供相同的GroupName。

javascript函数设置当前所选单选按钮样式的行以确定该行已被选中,然后循环通过gridview中的单选按钮,然后取消选择上一个选定的单选按钮并将行样式设置回它的默认值。

请参阅下面的代码,

JavaScript部分,

 <script language="javascript" type="text/javascript">
    function CheckOtherIsCheckedByGVID(rb) {
           var isChecked = rb.checked;
           var row = rb.parentNode.parentNode;

           var currentRdbID = rb.id;
           parent = document.getElementById("<%= GridView1.ClientID %>");
           var items = parent.getElementsByTagName('input');

           for (i = 0; i < items.length; i++) {
           if (items[i].id != currentRdbID && items[i].type == "radio") {
           if (items[i].checked) {
                items[i].checked = false;                   
            }
        }
     }
   }
</script>

Aspx部分,

     <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:TemplateField>
               <ItemTemplate>                          
                    <asp:RadioButton runat="server" ID="RadioButton1" onclick="javascript:CheckOtherIsCheckedByGVID(this);">
                    </asp:RadioButton>
               </ItemTemplate>
            </asp:TemplateField>                
        </Columns>
    </asp:GridView>

注意:这里使用的onclick是html属性,将出现在visual studio的intellisense属性中。所以只需按照我的代码中的说明输入。

我对此进行了测试,并且对我来说非常适合。

希望这对你有用..

答案 1 :(得分:2)

如上所述,在GridView中设置GroupName不起作用。当为GridView生成HTML时,所有单选按钮都会根据GridView分配不同的名称。这是一个link可能会帮助你:

他们经历了许多方法来完全按照你的要求去做。我还尝试将ClientIDMode设置为静态思维,这将保留名称,但这也不起作用。

希望该链接有所帮助。

答案 2 :(得分:0)

我有一个关于此HERE的博客。

结束看起来像:

enter image description here

使其有效的部分是:

<asp:TemplateField HeaderText="Best">
     <ItemTemplate>
          <input id="RBBest" type="radio" name="RBBest" value="{0}" />
     </ItemTemplate>
     <ItemStyle HorizontalAlign="Center" />
 </asp:TemplateField>

请注意,这是ItemTemplate中的HTML而不是ASP.Net标记。我们得到选定的索引 使用:

Request.Form["RBBest"]

所以要在我使用的示例的第二列中获取文本:

ViewState["selectedBest"] = 
     this.GridView1.Rows[Convert.ToInt32(Request.Form["RBBest"])].Cells[1].Text;

返回示例中的文本“SQL Server”。

答案 3 :(得分:0)

哈伦的答案非常好:只需检查其他答案。

我是使用Class和JQuery做的:

function removeotherrb(rb) {
        var items = $('.QaWs2');
        for (i = 0; i < items.length; i++) {
            var c1 = items[i].firstChild; 

           c1.checked = false;
       }
       rb.checked = true;            
   }

请注意,我首先检查OFF Everything,然后重新设置所选的一个。 请注意,当设置cssclass时,会创建一个具有此类的span,因此您必须以第一个孩子为目标; HTML呈现如下:

<span class="QaWs2">
<input id="ctl00_PageSectionPH_GVCol_ctl04_RB2" type="radio"     onclick="removeotherrb(this);" value="RB2" name="ctl00$PageSectionPH$GVCol$ctl04$Y"><input>
</span>