2011-07-08 45 views
2

我有一個gridview控件,其中使用存儲過程顯示數據。網格有三列,第一列包含單選按鈕。總的想法是,用戶應該能夠從(在我的情況下)5個單選按鈕中僅選擇一個單選按鈕。在gridview控件中使用單選按鈕

目前功能的問題是,我可以同時選擇所有的單選按鈕。我嘗試使用'groupname'屬性對單選按鈕進行分組..這不起作用。

我該如何解決?

這裏是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> 
+0

請參閱我已經發布了另一個答案。試試這個..它對我來說很完美... – Harun

回答

2

如前所述,設置組名,而在GridView不起作用。當爲GridView生成HTML時,所有單選按鈕都會根據GridView分配不同的名稱。這裏有一個link可能會幫助你:

他們經歷了許多方法來做你的要求。我也嘗試將ClientIDMode設置爲可以保留名稱的靜態思維,但這也不起作用。

希望鏈接有幫助。

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> 

說明這是HTML ItemTemplate中ASP.Net標記內不能及的。我們通過使用獲得所選擇的指數 :

Request.Form["RBBest"] 

因此要獲得文本在我使用的示例中的第二欄:

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

它會返回在例如文本的「SQL Server」。

+0

你爲什麼使用?爲什麼不能使用這個? – userstackoverflow

+0

由於GroupName =「RBBest」對每行都呈現不同的名稱,例如name =「GridView1:_ctl3:RBBest」,因此您可以選擇所有單選按鈕,因爲它們不屬於同一組。 – JBrooks

4

由於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屬性,將智能感知內出現視覺工作室的財產。所以只需輸入我的代碼中提供的。

我測試了這一點,併爲我完美工作。

希望這會爲你工作..

+0

我不得不將'parent = document.getElementById ...'更改爲'var parent = document.getElementById ...',但這對我很好〜 – lem

0

哈倫的答案是非常好的:剛檢查過其他的。

我做一個使用類和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;    
    } 

注意,我先檢查了一切,然後設置選定一個回。 注意當一個cssclass被設置時,創建這個類的跨度,所以你必須定位到firstChild; 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>