0

我有以下嵌套列表视图...

<asp:ListView ID="lvwRiskQuestions" runat="server" ItemPlaceholderID="QuestionItemPlaceholder">
    <LayoutTemplate>
        <asp:PlaceHolder ID="QuestionItemPlaceholder" runat="server" />
    </LayoutTemplate>
    <ItemTemplate>
        <%# Eval("DESCRIPTION")%>
            <asp:ListView ID="lvwAnswers" runat="server" ItemPlaceholderID="AnswerItemPlaceholder" DataSource='<%# Eval("Answers")%>'>
                <LayoutTemplate>
                    <asp:PlaceHolder ID="AnswerItemPlaceholder" runat="server" />
                </LayoutTemplate>
                <ItemTemplate>
                    <asp:RadioButton ID="rdbSelect" runat="server" AutoPostBack="true" OnCheckedChanged="rdbSelectChanged"/>                                        
                        <%# Eval("Description")%>
                </ItemTemplate>
        </asp:ListView>
    </ItemTemplate>
</asp:ListView>

我像这样抓住单选按钮 OnCheckedChanged ......

Protected Sub rdbSelectChanged(ByVal sender As Object, ByVal e As System.EventArgs)

    Dim rb1 As RadioButton = CType(sender, RadioButton)

    Dim lvwAnswers = DirectCast(lvwRiskQuestions.FindControl("lvwAnswers"), ListView)

    For Each row As ListViewItem In lvwAnswers.Items
        Dim rb As RadioButton = row.FindControl("rdbSelect")
        If rb IsNot Nothing AndAlso rb.Checked Then
            rb.Checked = False
        End If
    Next
    rb1.Checked = True
End Sub

我遇到的问题是“lvwAnswers”什么都没有。我猜我没有正确地做我的 findcontrol。

非常感谢任何帮助。

4

2 回答 2

3

如果您只是为答案生成单选按钮列表,则可以使用RadioButtonListcontrol。这将生成正确的 HTML,以便每个问题只能选择一个答案,而无需回发以取消选择其他选项。

如果您的答案模板包含多个RadioButton,事情会变得更加复杂。当它不在 aRadioButtonList中时,RadioButton使用UniqueID父级的NamingContainer来构建其唯一的组名。不幸的是,在您的示例中,这NamingContainerListViewDataItem来自lvwAnswers列表,并且每个答案都有不同的 ID。

您需要的是一个RadioButton将查看NamingContainer'sNamingContainer以生成其组名。您可以重新实现RadioButton控件,或者使用一点反射来更新私有_uniqueGroupName字段:

[ToolboxData("<{0}:ListRadioButton runat=\"server\" />")]
public class ListRadioButton : RadioButton
{
   private static readonly FieldInfo UniqueGroupNameField = FindUniqueGroupNameField();
   private string _uniqueGroupName;

   private static FieldInfo FindUniqueGroupNameField()
   {
      return typeof(RadioButton).GetField("_uniqueGroupName", 
         BindingFlags.NonPublic | BindingFlags.Instance);
   }

   protected virtual string CreateUniqueGroupName()
   {
      string result = GroupName;
      if (string.IsNullOrEmpty(result))
      {
         result = ID;
      }
      if (string.IsNullOrEmpty(result))
      {
         result = UniqueID;
      }
      else
      {
         Control container = NamingContainer;
         if (container != null)
         {
            if (container is IDataItemContainer)
            {
               container = container.NamingContainer ?? container;
            }

            result = container.UniqueID + base.IdSeparator + result;
         }
         else
         {
            string uniqueID = UniqueID;
            if (!string.IsNullOrEmpty(uniqueID))
            {
               int index = uniqueID.LastIndexOf(base.IdSeparator);
               if (index != -1)
               {
                  result = uniqueID.Substring(0, 1 + index) + result;
               }
            }
         }
      }

      return result;
   }

   private void EnsureUniqueGroupName()
   {
      if (_uniqueGroupName == null)
      {
         string value = CreateUniqueGroupName();
         if (UniqueGroupNameField != null) UniqueGroupNameField.SetValue(this, value);
         _uniqueGroupName = value;

         value = base.Attributes["value"];
         if (string.IsNullOrEmpty(value))
         {
            base.Attributes["value"] = UniqueID;
         }
      }
   }

   protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
   {
      EnsureUniqueGroupName();
      return base.LoadPostData(postDataKey, postCollection);
   }

   protected override void Render(HtmlTextWriter writer)
   {
      EnsureUniqueGroupName();
      base.Render(writer);
   }
}

使用该控件并使用site前缀注册后,您可以将代码更改为:

<asp:ListView ID="lvwRiskQuestions" runat="server" ItemPlaceholderID="QuestionItemPlaceholder">
<LayoutTemplate>
   <asp:PlaceHolder ID="QuestionItemPlaceholder" runat="server" />
</LayoutTemplate>
<ItemTemplate>
   <%# Eval("DESCRIPTION") %>
   <asp:ListView ID="lvwAnswers" runat="server" ItemPlaceholderID="AnswerItemPlaceholder" DataSource='<%# Eval("Answers")%>'>
   <LayoutTemplate>
      <asp:PlaceHolder ID="AnswerItemPlaceholder" runat="server" />
   </LayoutTemplate>
   <ItemTemplate>
      <site:ListRadioButton ID="rdbSelect" runat="server"
         Text='<%# Eval("Description") %>'
      />
   </ItemTemplate>
   </asp:ListView>
</ItemTemplate>
</asp:ListView>

在呈现的 HTML 中,每个问题的单选按钮将具有相同的name,您将只能为每个问题选择一个答案,而不必在每个选择上发布整个页面。

于 2012-11-07T14:09:36.140 回答
-1

我想指出,这个“复制/粘贴”代码不起作用,取自对 codeproject的评论(标题为“另一个选项”的评论)。原始代码确实有效。

这里是 :

using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Reflection;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

[AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class SimpleRadioButton : RadioButton
{
    private static readonly FieldInfo UniqueGroupNameField = FindUniqueGroupNameField();
    private string _uniqueGroupName;

    private static FieldInfo FindUniqueGroupNameField()
    {
        return typeof(RadioButton).GetField("_uniqueGroupName",
            BindingFlags.NonPublic | BindingFlags.Instance);
    }

    protected virtual string CreateUniqueGroupName()
    {
        string result = this.GroupName;
        if (string.IsNullOrEmpty(result))
        {
            result = this.ID;
        }
        if (string.IsNullOrEmpty(result))
        {
            result = this.UniqueID;
        }
        else
        {
            Control container = this.NamingContainer;
            if (null != container)
            {
                if (container is IDataItemContainer)
                {
                    container = container.NamingContainer ?? container;
                }

                result = container.UniqueID + base.IdSeparator + result;
            }
            else
            {
                string uniqueID = this.UniqueID;
                if (!string.IsNullOrEmpty(uniqueID))
                {
                    int index = uniqueID.LastIndexOf(base.IdSeparator);
                    if (-1 != index)
                    {
                        result = uniqueID.Substring(0, 1 + index) + result;
                    }
                }
            }
        }

        return result;
    }

    private void EnsureUniqueGroupName()
    {
        if (null == _uniqueGroupName)
        {
            string value = this.CreateUniqueGroupName();
            if (null != UniqueGroupNameField) UniqueGroupNameField.SetValue(this, value);
            _uniqueGroupName = value;

            // Make sure we have a value attribute:
            value = base.Attributes["value"];
            if (string.IsNullOrEmpty(value))
            {
                base.Attributes["value"] = this.UniqueID;
            }
        }
    }

    protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
        this.EnsureUniqueGroupName();
        return base.LoadPostData(postDataKey, postCollection);
    }

    protected override void Render(HtmlTextWriter writer)
    {
        this.EnsureUniqueGroupName();
        base.Render(writer);
    }
}
于 2012-11-14T20:02:14.577 回答