Pregunta

Me gustaría establecer que el estado habilitado de un botón sea la negación de un valor.

Entonces, dado este código:

<asp:CheckBox ID="DefaultChecked" 
              Checked='<%# Bind("IsDefaultMessage") %>' 
              Enabled="false" 
              runat="server" />

<asp:LinkButton ID="MakeDefaultButton" 
                runat="server" 
                CommandName="MakeDefault' 
                CommandArgument='<%# Bind("ResidentialInfoID") %>' 
                Text="Make Default" />

¿Cómo puedo hacer que el atributo LinkButton Enabled false si IsDefaultMessage == true ?

¿Fue útil?

Solución

Use Eval en lugar de Bind. La vinculación es para la vinculación bidireccional, es decir, para los casos en los que necesita poder guardar los datos en su fuente de datos.

Cuando usa Bind, la página compilada realmente generará un código que usa Eval para establecer el valor, más algo de código para leer el valor para guardar. Debido a que Bind se reemplaza con código generado, no puede usar ninguna lógica adicional con Bind.

<asp:CheckBox ID="DefaultChecked" Checked='<%# !(bool)Eval("IsDefaultMessage") %>' Enabled="false" runat="server" />
<asp:LinkButton ID="MakeDefaultButton" runat="server" CommandName="MakeDefault' CommandArgument='<%#Bind("ResidentialInfoID") %>' Text="Make Default"/>

Otros consejos

Si puede usar Eval, es solo un método de la clase Control . Es especial porque debe estar en el contexto de un bloque de límite de datos <% # ...% > . Además de eso, básicamente puede tratar el bloque como un bloque de expresión <% =% > :

<%# !(bool)Eval("IsDefaultMessage") %>

Si desea aún enlazarlo (Eval no es un viaje de ida y vuelta), tendrá que negarlo de un lado a otro durante el enlace de datos. Sin embargo, es posible que no necesite hacer esto si solo puede volver a redactar el control. Por ejemplo, si aparece una casilla de verificación, en lugar de etiquetarla como "No es el mensaje predeterminado" al usuario y negándolo de un lado a otro, que la etiqueta "es el mensaje predeterminado". Ejemplo contribuido, pero entiendes la idea.

Nunca he usado Bind, pero entiendo que es similar a Databinder.Eval. De cualquier manera, ambos métodos devuelven objetos, por lo que debe convertirlo en un valor booleano antes de evaluarlo.

<%# !Convert.ToBoolean(Bind("IsDefaultMessage") %>

Editar: Parece que esto no se puede hacer y usar un SqlDataSource en la página resolvería el problema. http://forums.asp.net/t/1009497.aspx .

En caso de que alguien esté buscando una opción con VB.Net

<asp:CheckBox ID="DefaultChecked" Checked='<%# NOT (Eval("IsDefaultMessage")) %>' Enabled="false" runat="server" />

Como recuerdo (ha pasado un tiempo), no hay ninguna magia en particular en <% # Bind (. Es solo #Bind ( dentro de <% .. ..% > ;. Lo que significa que querrías:

 <%  ! #Bind("IsDefaultMessage") %>'

El código

Checked='<%# Eval("IsDefaultMessage").ToString().Length() > 4 %>'

devolverá verdadero si IsDefaultMessage es falso Como " False " .Length = 5 y " True " .Length = 4

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top