Brian Boatright Brian Boatright - 11 months ago 65 Question

How to assign a method's output to a textbox value without code behind

How do I assign a method's output to a textbox value without code behind?

<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
<script runat="server">
Public TextFromString As String = "test text test text"
Public TextFromMethod As String = RepeatChar("S", 50) 'SubSonic.Sugar.Web.GenerateLoremIpsum(400, "w")

Public Function RepeatChar(ByVal Input As String, ByVal Count As Integer)
Return New String(Input, Count)
End Function
<html xmlns="">
<head id="Head1" runat="server">
<title>Test Page</title>
<form id="form1" runat="server">
<br />
<asp:TextBox ID="TextBox1" runat="server" Text="<%# TextFromString %>"></asp:TextBox>
<br />
<br />
<asp:TextBox ID="TextBox2" runat="server" Text="<%# TextFromMethod %>"></asp:TextBox>

it was mostly so the designer guys could use it in the aspx page. Seems like a simple thing to push a variable value into a textbox to me.

It's also confusing to me why

<asp:Label runat="server" ID="label1"><%=TextFromString%></asp:Label>


<asp:TextBox ID="TextBox3" runat="server">Hello</asp:TextBox>

works but

<asp:TextBox ID="TextBox4" runat="server"><%=TextFromString%></asp:TextBox>

causes a compilation error.

Answer Source

There's a couple of different expression types in .ASPX files. There's:

<%= TextFromMethod %>

which simply reserves a literal control, and outputs the text at render time.

and then there's:

<%# TextFromMethod %>

which is a databinding expression, evaluated when the control is DataBound(). There's also expression builders, like:

<%$ ConnectionStrings:Database %>

but that's not really important here....

So, the <%= %> method won't work because it would try to insert a Literal into the .Text property...obviously, not what you want.

The <%# %> method doesn't work because the TextBox isn't DataBound, nor are any of it's parents. If your TextBox was in a Repeater or GridView, then this method would work.

So - what to do? Just call TextBox.DataBind() at some point. Or, if you have more than 1 control, just call Page.DataBind() in your Page_Load.

Private Function Page_Load(sender as Object, e as EventArgs)
   If Not IsPostback Then
   End If
End Function