单选按钮事件并不总是触发

| 我有一个带有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();
                }
            }
        }
    
已邀请:
是否将此RadioButtonList指定为另一个UpdatePanel的AsyncPostBackTrigger?如果是这样,请检查以下链接:CheckedChanged事件未在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);
        }
    }
    
这就是我和解决方案所发生的事情。 我有一个单选按钮列表,它不在更新面板中,而是定义为更新面板的触发器。我也对onselectindex进行了更改。 Radiobuttonlist的第一个listitem属性为selected = \“ true \”,因此在页面加载时默认情况下将其选中。然后选择第二个listitem工作正常,回发并更新更新面板。 但是,再次选择第一项并不会触发onselectedindexchanged事件。使用Firefox强大的Inspect Element实用程序,我能够确定服务器正在生成html元素(仅在第一个默认列表项中选中)。但是由于单选按钮列表不在更新面板中,因此即使从视觉上看似乎在客户端选择了第二个单选按钮,第二项的checked = \“ checked \”属性也从未写入浏览器。因此,当第二次选择原始项目时,onselectedindexchanged不会触发服务器端,因为在POST事件中已经将新选择的索引指示为已选择。 如果列表位于您要刷新的面板内,您将不会看到此问题,因为回发会导致浏览器在新选择的项目上接收带有“ checked =”“ checked \”元素的“ new”元素。我页面的布局使它们在同一面板中不方便,因此对我来说,解决方法是将单选按钮列表放在它自己的小更新面板中。无论哪种方法适合您,答案都是确保单选按钮列表位于“某些更新”面板中,以便选中后可以将选中的属性发送给浏览器。     
<asp:ListItem Selected=\"True\">All</asp:ListItem>
单击\“全部\”不会更改选定的索引,因为已经选择了该项目,因此不会触发该事件。拾取其他任何选项都会更改所选选项,并导致事件触发。我相信您的目标是当您单击“全部”时显示所有状态的结果。您应该执行以下操作之一: 由于已选择\“ All \”,因此在最初加载页面时显示这些结果。 添加一个“搜索”按钮来启动回发,而不是使用单选按钮的“自动回发”。 用DropDownList替换RadioButtonList,并为其提供两个初始ListItem:\“选择状态\”-其值为空字符串,以及\“ All \”其值为\“ All \”。 \“ Pick a Status \”虚拟条目在DropDownList中看起来比在RadioButtonList中看起来更合适。 在上面列出的选项中,我个人更喜欢使用“搜索”按钮,因为AutoPostBack困扰着我。我讨厌AutoPostBack DropDownLists,当列表具有焦点时不小心使用了鼠标滚轮时,会使网页变得笨拙。     

要回复问题请先登录注册