visual valor property obtener net groupname ejemplos ejemplo asp c# asp.net radio-button radiobuttonlist

valor - radio button checked c# asp net



Evento de Radiobuttonlist no siempre disparando (3)

Tengo una lista de botones de radio con un evento selectedindexchanged que actualiza una función de búsqueda. Uno de los elementos se especifica en el aspx y los otros son elementos adjuntos de datos. No importa lo que establezca como predeterminado, ese elemento no activará el evento. Todos los demás elementos dispararán el evento. Además, parece que después de seleccionar el elemento "muerto", el evento no se disparará en absoluto.

¿Cómo puedo rastrear el error y corregirlo? Aquí está el código actual.

EDIT: Perdón si la versión corta fue engañosa. No estaba seguro de qué incluir. Aquí está toda la página.

Todos los 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>

Y detrás del código:

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(); } } }


<asp:ListItem Selected="True">All</asp:ListItem>

Al hacer clic en "Todos" no cambia el índice seleccionado ya que ese elemento ya estaba seleccionado, por lo que el evento no se activa. Escoger cualquier otra opción cambia la opción seleccionada y hace que el evento se dispare. Creo que su objetivo es mostrar resultados para todos los estados cuando hace clic en "Todos". Debe hacer una de las siguientes cosas:

  • Muestre esos resultados cuando la página se carga inicialmente ya que "Todo" ya está seleccionado.
  • Agregue un botón "Buscar" que inicie la devolución posterior en lugar de usar el AutoPostBack del botón de radio.
  • Reemplace RadioButtonList con DropDownList y asígnele dos ListItems iniciales: "Pick a Status" - cuyo valor es una cadena vacía, y "All" cuyo valor es "All". La entrada ficticia "Seleccionar un estado" se vería menos fuera de lugar en DropDownList que en RadioButtonList.

De las opciones enumeradas anteriormente, yo personalmente preferiría el botón "Buscar", porque AutoPostBack me molesta como usuario. Odio AutoPostBack DropDownLists que hace que la página web se vuelva loca cuando accidentalmente uso la rueda de mi mouse cuando la lista tiene foco.


¿Esta RadioButtonList se especifica como AsyncPostBackTrigger para otro UpdatePanel? Si es así, compruebe el siguiente enlace: evento CheckedChanged que no se activa en un botón de opción dentro de UpdatePanel

He reproducido ese comportamiento y lo soluciono con el siguiente script:

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

si no puede usar el jQuery intente este 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); } }


Esto es lo que me estaba pasando a mí y la solución.

Tenía una lista de botones de radio que no estaba en un panel de actualización, sino que se definió como un disparador para un panel de actualización. Yo también había seleccionado un índice de cambio definido. Radiobuttonlist tenía el primer atributo de elemento de lista seleccionado = "verdadero", por lo que se seleccionaría de forma predeterminada en la carga de la página. Luego, seleccionar el segundo elemento de lista funcionó bien, publicar y actualizar el panel de actualización.

Sin embargo, seleccionar nuevamente el primer elemento no se activaba en el evento seleccionado en el que se había cambiado el índice. Utilizando la asombrosa utilidad Inspect Element de Firefox, pude determinar que el servidor generaba el elemento html (seleccionado solo en el primer elemento de la lista por defecto). Pero como la lista de botones de radio no estaba en el panel de actualización, el atributo checked = "checked" para el segundo elemento nunca se estaba escribiendo en el navegador, aunque aparentemente el segundo botón de selección parecía estar seleccionado. Por lo tanto, al seleccionar el elemento original la segunda vez, el onselectedindexchanged no se activaba en el lado del servidor, porque el índice recién seleccionado ya estaba indicado como seleccionado en el evento POST.

No verá este problema si la lista se encuentra dentro del panel que desea actualizar, ya que la devolución de datos hace que el navegador reciba elementos "nuevos" con la marcada = "marcada" en el elemento recién seleccionado. El diseño de mi página hacía que no fuera conveniente tenerlos en el mismo panel, así que la solución para mí fue poner la lista de botones de radio en su propio pequeño panel de actualización. Lo que funcione para usted, la respuesta es asegurarse de que la lista de botones de radio esté en ALGÚN panel de actualización, por lo que el atributo comprobado se puede enviar al navegador para cada elemento cuando se selecciona.