asp.net - tutorial - que es asp net
Mostrar hide div usando codebehind (8)
Tengo una DropDownList
para la que estoy tratando de mostrar un div
OnSelectedIndexChanged
pero dice OBJECT REQUIRED
.
Estoy vinculando el DataList
en ese div:
aspx :
<asp:DropDownList runat="server" ID="lstFilePrefix1" AutoPostBack="True"
OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" >
<asp:ListItem Text="Prefix1" Value="Prefix1" />
<asp:ListItem Text="Prefix2" Value="Prefix2" />
<asp:ListItem Text="Prefix3" Value="Prefix3" />
<asp:ListItem Text="Prefix1 and Prefix2" Value="Prefix1 and Prefix2" />
<asp:ListItem Text="Prefix2 and Prefix3" Value="Prefix2 and Prefix3" />
</asp:DropDownList>
<asp:DataList ID="DataList1" runat="server" RepeatColumns="4"
CssClass="datalist1" OnItemDataBound="SOMENAMEItemBound"
CellSpacing="6" onselectedindexchanged="DataList1_SelectedIndexChanged"
HorizontalAlign="Center" Width="500px">
código detrás :
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
if (lstFilePrefix1.SelectedItem.Text=="Prefix2")
{
int TotalRows = this.BindList(1);
this.Prepare_Pager(TotalRows);
Page.ClientScript.RegisterClientScriptBlock(GetType(), "JScript1", "ShowDiv(''data'');", true);
}
}
javascript :
function ShowDiv(obj)
{
var dataDiv = document.getElementById(obj);
dataDiv.style.display = "block";
}
¿Qué estoy haciendo mal?
Estaba teniendo un problema donde la configuración de element.Visible = true en mi código detrás no tenía ningún efecto en la pantalla real. La solución para mí fue envolver el área de mi página donde quería mostrar el div en un UpdatePanel ASP, que se usa para causar actualizaciones parciales de la pantalla.
http://msdn.microsoft.com/en-us/library/bb399001.aspx
Tener el elemento runat = server me dio acceso a él desde el código de código, y al colocarlo en el Panel de Actualización dejé que se actualice en la pantalla.
Hacer el div
runat="server"
y hacer
if (lstFilePrefix1.SelectedValue=="Prefix2")
{
int TotalRows = this.BindList(1);
this.Prepare_Pager(TotalRows);
data.Style["display"] = "block";
}
Su método no está funcionando porque el javascript se está representando en la parte superior de la etiqueta del cuerpo, antes de que se genere el div. Tendría que incluir un código para decirle a javascript que espere a que el DOM esté completamente listo para atender su solicitud, lo que probablemente sería más fácil de hacer con jQuery.
Hay algunas formas de manejar los controles de representación / visualización en la página y debe tomar nota de lo que sucede con cada método.
Representación y visibilidad
Hay algunos casos en los que los elementos de su página no tienen que representarse para el usuario debido a algún tipo de valor lógico o de base de datos. En este caso, puede evitar la representación (creando el control en la página web devuelta) por completo. Desearía hacer esto si el control no necesita mostrarse más adelante en el lado del cliente, ya que no importa qué, el usuario que ve la página nunca necesita verla.
Cualquier control o elemento puede tener su visibilidad establecida desde el lado del servidor. Si se trata de un elemento html antiguo, simplemente debe establecer el valor del atributo runat
en el server
en la página de marcado.
<div id="myDiv" runat="server"></div>
La decisión de hacer que el div o no se pueda hacer ahora se puede hacer en el código detrás de la clase así:
myDiv.Visible = someConditionalBool;
Si se establece en verdadero, se representará en la página y si es falso no se representará en absoluto, ni siquiera se ocultará.
Ocultación lateral del cliente
La ocultación de un elemento se realiza únicamente en el lado del cliente. Es decir, está renderizado pero tiene un estilo de display
CSS configurado que le indica a su navegador que no se lo muestre al usuario. Esto es beneficioso cuando desea ocultar / mostrar cosas en función de las aportaciones del usuario. Es importante saber que el elemento PUEDE estar oculto en el lado del servidor siempre que el elemento / control tenga runat=server
configurado tal como lo expliqué en el ejemplo anterior.
Escondiéndose en el código detrás de clase
Para ocultar un elemento que desea que se represente en la página, pero oculto, se encuentra otra línea simple de código:
myDiv.Style["display"] = "none";
Si necesita eliminar el lado del servidor de estilo de display
, puede hacerlo eliminando el estilo de display
o configurándolo en un valor diferente, como en inline
o en block
(los valores se describen here ).
myDiv.Style.Remove("display");
// -- or --
myDiv.Style["display"] = "inline";
Ocultar en el lado del cliente con javascript
Usando javascript antiguo, puedes ocultar fácilmente el mismo elemento de esta manera
var myDivElem = document.getElementById("myDiv");
myDivElem.style.display = "none";
// then to show again
myDivElem.style.display = "";
jQuery simplifica un poco los elementos ocultos si prefiere usar jQuery:
var myDiv = $("#<%=myDiv.ClientID%>");
myDiv.hide();
// ... and to show
myDiv.show();
Ocultar en el lado del cliente con javascript
Usando javascript antiguo, puede ocultar fácilmente el mismo elemento de esta manera:
var myDivElem = document.getElementById("myDiv");
myDivElem.style.display = "none";
Luego para mostrar de nuevo:
myDivElem.style.display = "";
jQuery simplifica un poco los elementos ocultos si prefiere usar jQuery:
var myDiv = $("#<%=myDiv.ClientID%>");
myDiv.hide();
... y para mostrar:
myDiv.show();
Otro método (que parece que nadie ha mencionado hasta ahora), es agregar un par KeyValue adicional a la matriz de estilo del elemento. es decir
Div.Style.Add("display", "none");
Esto tiene la ventaja adicional de simplemente ocultar el elemento, en lugar de evitar que se escriba en el DOM para comenzar, a diferencia de la propiedad "Visible". es decir
Div.Visible = false
los resultados en el div nunca se escriben en el DOM.
Edición: Esto debe hacerse en el ''código subyacente'', es decir, el archivo * .aspx.cs.
Puede usar un Panel de ASP.NET estándar y luego establecer su propiedad visible en su código detrás.
<asp:Panel ID="Panel1" runat="server" visible="false" />
Para mostrar el panel en codebehind:
Panel1.Visible = true;
RegisteredClientScriptBlock
agrega la secuencia de comandos en la parte superior de la página en el post-back sin garantía de la orden , lo que significa que la llamada se está inyectando después de la declaración de la función (su archivo js con la función está en línea después de su llamada) o cuando es probable que el script intente ejecutar el div todavía no esté allí porque la página aún se está mostrando. Una buena idea es probablemente simular los dos escenarios que describí anteriormente en firebug y ver si obtienes errores similares.
Supongo que esto funcionaría si añades el script en la parte inferior de la página con RegisterStartupScript
, que vale la pena al menos.
De todos modos, como una solución alternativa si agrega el atributo runat="server"
al div, podrá acceder a él por su id en el código de código (sin volver a js, que genial podría ser), y hacerlo desaparecer como esta:
data.visible = false
<div id="OK1" runat="server" style ="display:none" >
<asp:DropDownList ID="DropDownList2" runat="server"></asp:DropDownList>
</div>
código vb.net
Protected Sub DropDownList1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DropDownList1.SelectedIndexChanged
If DropDownList1.SelectedIndex = 0 Then
OK1.Style.Add("display", "none")
Else
OK1.Style.Add("display", "block")
End If
End Sub