【问题标题】:Radiobuttonlist event not always firingRadiobuttonlist 事件并不总是触发
【发布时间】:2011-08-31 04:53:31
【问题描述】:

我有一个带有 selectedindexchanged 事件的单选按钮列表,用于更新搜索功能。其中一项是在 aspx 中指定的,其他项是附加的数据绑定项。无论我将什么设置为默认值,该项目都不会触发事件。所有其他项目将触发该事件。另外,似乎在选择“死”项后,事件根本不会触发。

我如何追踪错误并进行更正?这是当前代码。

编辑:抱歉,如果简短版本具有误导性。我不确定要包括什么。这是整个页面。

所有aspx:

     <%@ Page Language="C#" MasterPageFile="~/MSDS/MSDS.master" EnableEventValidation="false"
    AutoEventWireup="true" CodeFile="SearchMSDS.aspx.cs" Inherits="MSDS_ByDept" Title="NCLWeb - Search MSDS" %>

<%@ Register Assembly="SqlWhereBuilder" Namespace="UNLV.IAP.WebControls" TagPrefix="cc1" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc2" %>
<asp:Content ID="Content1" ContentPlaceHolderID="PageContent" runat="Server">
    <h2>
        <asp:Label ID="lblTitle" runat="server">Search Active MSDS</asp:Label></h2>
    <table class="style1">
        <tr>
            <td style="width: 435px" valign="top">
                <asp:Panel runat="server" ID="pnlSearch" DefaultButton="btnSearch">
                    <asp:TextBox ID="txtSimpleSearch" runat="server" Width="262px"></asp:TextBox>
                    <asp:Button ID="btnSearch" runat="server" Text="Search" Width="96px" OnClick="btnSearch_Click" />
                    <br />
                    <asp:LinkButton ID="btnAdvSearch" runat="server" OnClick="btnAdvSearch_Click" Font-Size="Small">Show Advanced Search</asp:LinkButton>
                </asp:Panel>
                <asp:Panel ID="pnlAdvSearch" runat="server" Width="635px" DefaultButton="btnRunAdvSearch">
                    <asp:Button ID="btnRunAdvSearch" runat="server" OnClick="btnRunAdvSearch_Click" Text="Advanced Search" />
                    <cc1:SqlWhereBuilder ID="SqlWhereBuilder1" runat="server" ClientCodeLocation="../JavaScripts/SqlWhereBuilder.js"
                        FieldsFile="../ConfigFiles/SearchMSDS.config" OperatorListsFile="../ConfigFiles/SearchMSDS.config"
                        ValueEntryFile="../ConfigFiles/SearchMSDS.config">
                    </cc1:SqlWhereBuilder>
                    <br />
                    <br />
                </asp:Panel>
                <cc2:CollapsiblePanelExtender ID="pnlAdvSearch_CollapsiblePanelExtender" runat="server"
                    CollapseControlID="btnAdvSearch" Collapsed="True" Enabled="True" ExpandControlID="btnAdvSearch"
                    TargetControlID="pnlAdvSearch">
                </cc2:CollapsiblePanelExtender>
            </td>
            <td valign="top">
                <asp:Panel ID="pnlStatus" runat="server">
                    <asp:RadioButtonList ID="rblStatus" runat="server" AppendDataBoundItems="True"
                        AutoPostBack="True" DataSourceID="SqlDataSource1" DataTextField="DisplayValue"
                        DataValueField="Value" OnSelectedIndexChanged="RadioButtonList1_SelectedIndexChanged"
                        RepeatDirection="Horizontal" CellPadding="3" CellSpacing="3" 
                        CausesValidation="True" Visible="True">
                        <asp:ListItem Selected="True">All</asp:ListItem>
                    </asp:RadioButtonList>
                </asp:Panel>
                <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NCLWebConnectionString %>"
                    SelectCommand="getOptionList" SelectCommandType="StoredProcedure">
                    <SelectParameters>
                        <asp:Parameter DefaultValue="msds_Status" Name="ListName" Type="String" />
                    </SelectParameters>
                </asp:SqlDataSource>
                <asp:UpdatePanel runat="server" ID="upd2">
                    <ContentTemplate>
                        <asp:Button ID="btnExport" runat="server" Text="Export Results" 
                            OnClick="btnExport_Click1" UseSubmitBehavior="False" />
                    </ContentTemplate>
                </asp:UpdatePanel>
            </td>
        </tr>
    </table>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="100" DynamicLayout="False">
                <ProgressTemplate>
                    <img src="../images/loading.gif" alt="Loading..." style="text-align: center" />
                    <asp:Label ID="lblProgress" runat="server"></asp:Label></ProgressTemplate>
            </asp:UpdateProgress>
            <asp:GridView ID="gridResults" runat="server" DataSourceID="sqlMSDS" OnRowDataBound="GridView1_RowDataBound"
                AllowPaging="True" PageSize="25" AllowSorting="True" OnSelectedIndexChanged="gridResults_SelectedIndexChanged"
                AutoGenerateColumns="False" EmptyDataText="No matching MSDS Sheets." OnSorted="gridResults_Sorted">
                <Columns>
                    <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" Visible="false"
                        ReadOnly="True" SortExpression="ID" />
                    <asp:BoundField DataField="ChemicalTitle" HeaderText="ChemicalTitle" SortExpression="ChemicalTitle" />
                    <asp:BoundField DataField="Manufacturer" HeaderText="Manufacturer" SortExpression="Manufacturer" />
                    <asp:BoundField DataField="UsageDept" HeaderText="UsageDept" SortExpression="UsageDept" />
                    <asp:BoundField DataField="Notes" HeaderText="Notes" SortExpression="Notes" />
                    <asp:BoundField DataField="Health" HeaderText="Health" visible="false" SortExpression="Health" />
                    <asp:BoundField DataField="Fire" HeaderText="Fire"  visible="false" SortExpression="Fire" />
                    <asp:BoundField DataField="Reactivity" HeaderText="Reactivity"  visible="false" SortExpression="Reactivity" />
                    <asp:BoundField DataField="DateUpdated" HeaderText="DateUpdated" SortExpression="DateUpdated" />
                </Columns>
                <SelectedRowStyle BackColor="Yellow" />
            </asp:GridView>
            <asp:SqlDataSource ID="sqlMSDS" OnSelected="sqlMSDS_OnSelected" runat="server" ConnectionString="<%$ ConnectionStrings:NCLWebConnectionString %>"
                SelectCommand="SELECT [ID]
                                      ,[ChemicalTitle]
                                      ,[Manufacturer]
                                      ,[UsageDept]
                                      ,[Notes]
                                      ,[Health]
                                      ,[Fire]
                                      ,[Reactivity]
                                      ,[DateUpdated]
                                      FROM [msds_Sheets]" OnSelecting="sqlMSDS_Selecting"></asp:SqlDataSource>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="btnSearch" EventName="Click" />
            <asp:AsyncPostBackTrigger ControlID="btnRunAdvSearch" EventName="Click" />
            <asp:AsyncPostBackTrigger ControlID="rblStatus" EventName="SelectedIndexChanged" />
            <asp:AsyncPostBackTrigger ControlID="btnExport" EventName="Click" />
        </Triggers>
    </asp:UpdatePanel>
    <br />
</asp:Content>

还有代码隐藏:

    List<String> safeWords = new List<String>();

protected void Page_Load(object sender, EventArgs e)
{
    pnlStatus.Visible = User.IsInRole("msds_Admin");

    gridResults.DataKeyNames = new String[] { "id" };

    txtSimpleSearch.Focus();

    if (!IsPostBack)
    {
        safeWords.Add("delete");
        safeWords.Add("insert");
        safeWords.Add("update");
        safeWords.Add("set");
        safeWords.Add("exec");
        safeWords.Add("N'");

        sqlMSDS.SelectCommand += " Where status = 0 ";

        Session["Sql"] = sqlMSDS.SelectCommand;

        try
        {
            Session["OriginalSQL"] = sqlMSDS.SelectCommand.Remove(sqlMSDS.SelectCommand.IndexOf("Where"));
        }
        catch (Exception)
        {
            Session["OriginalSQL"] = sqlMSDS.SelectCommand;
        }
    }
}

protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            ((Label)UpdateProgress1.FindControl("lblProgress")).Text = "Searching...";

            if (btnSearch.Visible)
            {
                btnSearch_Click(null, null);

                if (RadioButtonList1.SelectedValue != "All")
                {
                    sqlMSDS.SelectCommand += " And Status = " + RadioButtonList1.SelectedValue;
                }
                else
                {
                    //Somehow force the grid to research using no status parameter
                    sqlMSDS.SelectCommand = Session["Sql"].ToString();
                }
            }
            else
            {
                btnRunAdvSearch_Click(null, null);

                if (RadioButtonList1.SelectedValue != "All")
                {
                    if (sqlMSDS.SelectCommand.Contains("Where"))
                    {
                        sqlMSDS.SelectCommand += " And Status = " + RadioButtonList1.SelectedValue;
                    }
                    else
                    {
                        sqlMSDS.SelectCommand += " Where Status = " + RadioButtonList1.SelectedValue;
                    }
                }
                else
                {
                    //Somehow force the grid to research using no status parameter
                    sqlMSDS.SelectCommand = Session["Sql"].ToString();
                }
            }
        }

【问题讨论】:

  • 您的问题不清楚。所以你的意思是它根本不做 PostBack 或在某些情况下做?您是否在代码隐藏中设置断点并查看发生了什么?页面上是否有任何验证?如果是,看看他们是否在干扰。您可以通过为您的 RBL 设置 CausesValidation="false 来检查这一点。
  • 回发在所有情况下都会发生,除非设置为默认值。页面上没有验证。
  • 很奇怪。即当您选择“全部”项目时,它看起来是默认的,对吗?只是为了确保您在更改正确时执行此操作,而不是在已选择时执行此操作?我能想到的另一件事是干扰该特定项目的任何 javascript 代码。抱歉猜测,但我看不出有任何理由不应该只回发一项。
  • @gbs -是的,当我在这种情况下选择“全部”时。但是我尝试更改默认值并获得与该项目相同的结果。页面上没有任何 Javascript。是的,为了测试我一直在选择其他值之一,然后单击默认值,这应该会触发 selectedindexchanged 事件。
  • 抱歉,线索不多了,不调试就很难判断。也许你可以在一个全新的页面中尝试。调试时是否尝试在 Page_Load 中设置断点?

标签: c# asp.net radio-button radiobuttonlist


【解决方案1】:

这是发生在我身上的事情和解决方法。

我有一个单选按钮列表,它不在更新面板中,但定义为更新面板的触发器。我也定义了 onselectedindexchanged 。 Radiobuttonlist 有第一个 listitem 属性 selected="true",因此默认情况下会在页面加载时选择它。然后选择第二个列表项工作正常,发回并更新更新面板。

但是,再次选择第一项并没有触发 onselectedindexchanged 事件。使用 Firefox 令人敬畏的 Inspect Element 实用程序,我能够确定服务器正在生成 html 元素(仅检查第一个默认列表项)。但是由于单选按钮列表不在更新面板中,因此第二项的 checked="checked" 属性永远不会写入浏览器,即使客户端的第二个单选按钮在视觉上似乎已被选中。因此,当第二次选择原始项目时,onselectedindexchanged 没有触发服务器端,因为新选择的索引已经在 POST 事件中指示为选中。

如果列表位于要刷新的面板内,您将不会看到此问题,因为回发会导致浏览器在新选择的项目上接收带有 checked="checked" 的“新”元素。我的页面布局使得将它们放在同一个面板中很不方便,所以我的解决方法是将单选按钮列表放在它自己的小更新面板中。无论哪种方式适合您,答案是确保单选按钮列表位于某些更新面板中,以便在选中每个项目时将选中的属性发送到浏览器。

【讨论】:

    【解决方案2】:

    此 RadioButtonList 是否指定为另一个 UpdatePanel 的 AsyncPostBackTrigger?如果是这样,请检查以下链接:CheckedChanged event not firing on a radio button within UpdatePanel

    我已重现该行为并使用以下脚本修复此问题:

     $(function () {
            $("input[type='radio']:first", $("#<%= RadioButtonList1.ClientID %>")).attr("checked", true);
        });
    

    如果你不能使用 jQuery,试试这个 javascript:

     window.onload = function () {
            window.document.getElementById("<%= RadioButtonList1.ClientID %>_0").checked = true;
        };
    
    
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ClientScript.RegisterStartupScript(this.GetType(), "RadioButtonListDefaultValue", String.Format("window.document.getElementById('{0}_0').checked = true;", RadioButtonList1.ClientID), true);
            }
        }
    

    【讨论】:

    • 这是 JQuery 吗?我没有在这个项目中使用过类似的东西。
    • @1stein 你假设他正在使用UpdatePanel?还是我错过了什么?
    • 这只是因为我发现默认检查值不会触发 OnSelectedIndexChanged 事件。
    • 对。此外,如果您有可以触发非异步回发的控件,则必须在 Page_Load 事件中的服务器端添加该脚本,而不是在页面的标记中添加脚本。我有针对这种情况的更新答案。
    • 实际上,您几乎没有办法修复此错误,然后使用通常的行为。第一个是编写自定义控件,从 RadioButtonList 继承然后使用它。二是为 RadioButtonList 控件实现适配器。诀窍是删除 Selected 属性值并注册适当的 javascript。在此处查找自定义控件的解决方案:pastebin.com/UJa6JPVc
    【解决方案3】:

    正如用户 user2965308 所说,如果 RadioButtonList 在 UpdatePanel 内,则不会发生此问题。

    https://www.codeproject.com/Questions/118042/RadioButtonList-Postback-issue-when-selected-by-co “在更新面板中获取它,属性“ChildrenAsTriggers”为真。这为我解决了这个问题。”

    【讨论】:

      【解决方案4】:
      <asp:ListItem Selected="True">All</asp:ListItem>
      

      单击“全部”不会更改所选索引,因为该项目已被选中,因此不会触发事件。选择任何其他选项会更改所选选项并导致事件触发。我相信您的目标是在单击“全部”时显示所有状态的结果。您应该执行以下操作之一:

      • 在初始加载页面时显示这些结果,因为已选择“全部”。
      • 添加一个“搜索”按钮来启动回发,而不是使用单选按钮的 AutoPostBack。
      • 将 RadioButtonList 替换为 DropDownList,并为其指定两个初始 ListItem:“Pick a Status” - 其值为空字符串,以及“All”,其值为“All”。 “Pick a Status”虚拟条目在 DropDownList 中看起来不像在 RadioButtonList 中那样不合适。

      在上面列出的选项中,我个人更喜欢“搜索”按钮,因为作为用户,AutoPostBack 让我很恼火。我讨厌 AutoPostBack DropDownLists,当我在列表获得焦点时不小心使用鼠标滚轮时,它会使网页变得疯狂。

      【讨论】:

      • 我确实有一个搜索按钮,但我希​​望搜索结果在单选按钮更改时自动更新。另外,我相信您并没有完全关注我的问题:当我选择另一个选项时,然后返回默认选项,这是我没有得到事件的地方。
      • 另外,我真的很想让单选按钮列表工作,因为它在视觉上很有意义,我喜欢这种设计。我对替换单选按钮列表并不是很感兴趣,尤其是因为它应该能够做到这一点。
      猜你喜欢
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2014-12-28
      • 2012-12-13
      相关资源
      最近更新 更多