2009-03-04 5 views
12

Ich möchte den aktivierten Status einer Schaltfläche als Negierung eines Werts festlegen.Kann ich den Wert in einem Attribut, das ein "Eval" verwendet, negieren?

So diesen Code gegeben:

<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" /> 

Wie kann ich die Linkbutton machen Enabled Attribut false wenn IsDefaultMessage == true?

Antwort

20

Verwenden Sie Eval anstelle von Bind. Bindung ist für bidirektionale Bindung, d. H. Für Fälle, in denen Sie die Daten in Ihrer Datenquelle speichern müssen.

Wenn Sie Bind verwenden, hat die kompilierte Seite tatsächlich Code generiert, der Eval verwendet, um den Wert festzulegen, sowie einen Code, um den Wert zum Speichern auszulesen. Da Bindung durch generierten Code ersetzt wird, können Sie mit Bind keine zusätzliche Logik verwenden.

<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"/> 
-1

Wie ich mich erinnere (Es ist eine Weile her), gibt es keine besondere Magie in <%#Bind(. Es ist nur #Bind( innerhalb <% ....%>. Was bedeutet, würden Sie wollen:

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

dies wird nicht funktionieren ... die <%#...%> lässt ASP.NET wissen, dass es ist findet während der Datenbindung statt ... der! muss nach dem # gehen. –

5

Wenn Sie Eval verwenden können, ist es nur eine Methode der Control Klasse. Es ist nur insofern speziell, als es im Zusammenhang mit einem datengebundenen Block <%# ... %> stehen muss. Other than that, können Sie grundsätzlich den Block wie ein normaler <%= %> Ausdruck Block behandeln:

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

Wenn Sie noch wollen, dass es binden (Eval ist nicht Round-Trip), als Sie es wieder zunichte zu machen brauchen, und während der Datenbindung. Sie müssen dies jedoch möglicherweise nicht tun, wenn Sie das Steuerelement einfach umschreiben können. Zum Beispiel, wenn ein Kontrollkästchen, anstatt es "Is Not Default Message" für den Benutzer und negieren es vor und zurück, als lable es "ist Standard-Nachricht". Contrived Beispiel, aber Sie bekommen die Idee.

+0

Dies führt zu einem Fehler "ungültiger Präprozessordirektivitätsknoten". Irgendwelche Ideen zur Lösung? – KevDog

+0

Auch "Operator kann nicht auf Operanden vom Typ Objekt angewendet werden" – KevDog

+0

Sie haben Recht - Bind kann nicht verwendet werden, wie ich es hatte. Ich habe es auf Eval umgestellt und beschrieben, wie man die Verwendung von Workaround Binden kann. –

1

Ich habe nie Bind verwendet, aber mein Verständnis ist, dass es Datachinder.Eval ähnlich ist. In beiden Fällen geben beide Methoden Objekte zurück, sodass Sie sie vor der Auswertung in einen Booleschen Wert umwandeln müssen.

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

Edit: Sieht aus wie dies nicht getan werden kann, und einen SqlDataSource auf der Seite unter Verwendung würde das Problem lösen. http://forums.asp.net/t/1009497.aspx.

+0

Das wirft den Fehler" Der Name 'Bind' existiert im aktuellen Kontext nicht. " – KevDog

+0

Gibt es einen Grund, warum Sie Bind verwenden möchten? using DataBinder.Eval? <% #! Convert.ToBoolean (DataBinder.Eval (Container.DataItem, "IsDefaultMessage"))%> – rmw

+0

Hier ist ein Forum zu diesem Thema: http://forums.asp.net/t/1009497 .aspx. Können Sie Ihrer Seite eine SqlDataSource hinzufügen? Es sieht so aus, als könnte es funktionieren. – rmw

-1

Der Code

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

wahr zurück, wenn IsDefaultMessage falsch ist Da "False" .Length = 5 und "True" .Length = 4

1

Falls jemand sucht eine Option mit VB.Net

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