Bind value of property to result of some method in ASP.NET - asp.net

I need to bind an ASP.NET control something like so:
<asp:label ID="lblName" Text=<%# GetName()) %>
and in CodeBehind file I have this method:
protected string GetName()
{
...
}
Is this right, or how I can do something like this?

Methods in code-behind need to be public I believe; I could be wrong, but I've gotten this to work:
<asp:label ID="lblName" Text='<%= GetName() %>' />
With
public string GetName()
{
...
}
HTH

Try:
<asp:Label ID="Status" runat="server"><%# this.Test() %></asp:Label>
The above code assumes that you have a method called Test() with public access that returns a string in its implementation file.

Related

ASP.NET string resource to lower case?

I'm including a string resource in an ASPX:
<asp:Literal runat="server" Text="<%$ Resources:Global, MyString %>"/>
Let's say the value of MyString is "Home". How can I convert that to lower case ("home") in the resource tag? E.g., I don't want to have to store both upper/title and lower case variants of the string in the resource file.
I realize I could do this normally (outside a control) like this:
<%= Resources.Global.MyString.ToLower() %>
But that doesn't help when I have to use a resource for some property of a control. I was hoping to be able to do something simple such as:
<asp:Literal runat="server" Text="<%$ (Resources:Global, MyString).ToLower() %>"/>
I ended up building my own ExpressionBuilder which uses the built-in ResourceExpressionBuilder to get the underlying resource value and then convert it to lower case:
Convert the Base Expression to a Lower-case String
public class ResourceLowerCase : ResourceExpressionBuilder
{
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
CodeExpression getResourceExpression = base.GetCodeExpression(entry, parsedData, context);
CodeMethodInvokeExpression toStringExpression = new CodeMethodInvokeExpression(getResourceExpression, "ToString");
CodeMethodInvokeExpression toLowerExpression = new CodeMethodInvokeExpression(toStringExpression, "ToLower");
return toLowerExpression;
}
}
Register the Expression Builder
<system.web>
<expressionBuilders>
<add expressionPrefix="ResourceLowerCase" type="My.Project.Compilation.ResourceLowerCase"/>
</expressionBuilders>
</compilation>
Invoke the Expression Builder
<asp:Literal runat="server" Text="<%$ ResourceLowerCase:Global, MyString %>" />
Have you tried:
<asp:Literal runat="server" Text="<%$ Code:
GetGlobaloResources("MyString").ToString().ToLower() %>"/>
Just pseudo code.
Update:
http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx
Just use the CodeExpressionBuilder from above link.

How to call a code-behind method from aspx page?

I've an object that contains a field called DevList which is defined like this
public List<string> DevList { get; set; }
I also defined a method called DisplayListOfDevelopers that is supposed to concatenate the list of developers and display it as a one string.
This is how I'm calling the method from aspx.
<asp:TemplateField HeaderText = "Developer(s)">
<ItemTemplate>
<asp:Label
ID="_lblDevList"
runat="server"
Text= '<%# DisplayListOfDevelopers(DevList) %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
But, I'm getting this error: The name 'DevList' does not exist in the current context
Am I missing something?
EDIT
_gvStatus = ds;
_gvStatus.DataBind();
Where ds is just a list of objects that contains the DevList for now.
Thanks for helping
Assuming this is how your class looks:
public class MyItem
{
public List<string> DevList { get; set; }
}
And that
ds = List<MyItem>();
Do this:
In your code-behind:
protected string DisplayListOfDevelopers(object _devList)
{
//Cast your dev list into the correct object
}
In your markup:
<asp:TemplateField HeaderText="Developer(s)">
<ItemTemplate>
<asp:Label
ID="_lblDevList"
runat="server"
Text='<%# DisplayListOfDevelopers(Eval("DevList")) %>'>
</asp:Label>
</ItemTemplate>
</asp:TemplateField>
Just be sure to make the function in your code-behind is protected or public.

How to Bind complex data to control in ListView (class User contain instance of class UserType)

I have 2 value class
public class UserType
{
public int ID;
public string TypeName;
}
public class User
{
public int ID;
public string UserName;
public UserType Type;
}
1 proccessing class
public class Users
{
public User[] GetUsers()
{
//Retrive and re turn User array
}
public int Update(User user, User old_user)
{
//Update user
}
}
1 ListView and 1 ObjectDataSource
<asp:ListView ID="lsvUser" runat="server" DataKeyNames="ID" DataSourceID="odsUser"
ItemPlaceholderID="plhItem" onitemupdating="lsvUser_ItemUpdating">
<LayoutTemplate>
<ul><asp:PlaceHolder ID="plhItem" runat="server"></asp:PlaceHolder></ul>
</LayoutTemplate>
<ItemTemplate>
<li>
<asp:Label ID="lblID" runat="server" Text='<%# Eval("ID") %>'></asp:Label>
<asp:Label ID="lblUserName" runat="server" Text='<%# Eval("UserName") %>'></asp:Label>
<asp:Label ID="lblTypeName" runat="server" Text='<%# Eval("Type.TypeName") %>'></asp:Label>
<asp:LinkButton ID="btEdit" runat="server" CssClass="button" CommandName="Edit" Text="Edit"></asp:LinkButton>
</li>
</ItemTemplate>
<EditItemTemplate>
<li class="editRow">
<asp:Textbox ID="txbUserName" runat="server" Text='<%# Bind("UserName") %>'></asp:Textbox >
<asp:Textbox ID="txbTypeName" runat="server" Text='<%# Bind("Type.TypeName") %>'></asp:Textbox >
</li>
</EditItemTemplate>
</asp:ListView>
<asp:ObjectDataSource ID="odsUser" runat="server" TypeName="BLL.Users" DataObjectTypeName="BLL.User" SelectMethod="GetUsers" UpdateMethod="Update" ConflictDetection="CompareAllValues" OldValuesParameterFormatString="old_{0}"></asp:ObjectDataSource>
When data is loaded into the ItemTemplate, the ListView interprets Type.TypeName and binds correctly,
but when updating the record, I cannot retrieve the old_user.Type from the old values. So old_user.Name and old_user.ID have values but old_user.Type is null.
Help me. I have been searching for about 2 days and cannot find a solution. I can bind data for a new user like this:
protected void lsvUser_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
e.NewValues.Add("Type", new BLL.UserType() { TypeName = Convert.ToString(((TextBox)lsvUser.EditItem.FindControl("txbTypeName")).Text) });
}
But I don't know how to retrieve the old values (how to retrive value of lblTypeName).
Help me. If there is a solution that doesn't require additional code in the ItemUpdating event, please teach me.
Thank you.
Add Type.TypeName as a DataKey, like this:
<asp:ListView ID="ListView1" runat="server" DataKeyNames="Type.TypeName">
And in your ItemUpdating event handler, retrieve the key value like this:
string typeName = (string)e.Keys["Type.TypeName"];
I'm not positive that "Type.TypeName will work, but some variation of that should work, whether it's Type.TypeName or just TypeName.

extension method in gridview eval

I have an extension method that I wrote but when I use it on an aspx page to render a label inside a gridview, it doesn't work.
<asp:Label ID="lblStatus" runat="server" Text='<%# Eval("TheStatus").ToMyStatus() %>'></asp:Label>
The extension method is a file called Appfunctions.cs:
public static class Extensions
{
public static string ToMyStatus(byte TheStatus)
{
//mycode
}
}
I've seen posts that say a namespace needs to be added with the Imports statement in the aspx page but the extention ToMyStatus is not in any particular namespace.
Any suggestions much appreciated.
Thanks.
You have missed this and type conversion.
public static class Extensions
{
public static string ToMyStatus(this byte TheStatus)
{
return "Hello : " + TheStatus;
}
}
Markup
<asp:Label ID="lblStatus"
runat="server"
Text='<%# ((byte)Eval("TheStatus")).ToMyStatus() %>'>
</asp:Label>

calling a function in repeater asp.net

I want to call a function to bind data to Repeater . Do I need to Set dataSource Property of this control or Repeater .DataBind() will work.
<asp:Repeater ID="RepeaterDays" runat="server">
<ItemTemplate>
<ul>
<asp:Label ID="lblDays" runat="server" Text='<%#ChandanIdiot()%>'></asp:Label>
</ul>
</ItemTemplate>
</asp:Repeater>
I have written RepeaterDays.Databind(), but the function is not called.
This is displaying nothing.
Is ChandanIdiot() a protected function that returns a string?
protected string ChandanIdiot() {
return "test";
}
If you want to actually do some data processing, you will have to include a parameter:
protected string ChandanIdiot(object obj) {
return "test " + obj;
}
And, assuming that there is a property called "Name" on the object that you are reapeating, you would have the following:
<asp:Label ID="lblDays" runat="server" Text='<%# ChandanIdiot(Eval("Name")) %>' />
Source:
<asp:TemplateField HeaderText="Unit Price">
<ItemTemplate>
<%# ChandanIdiot( Eval("product_unitprice"))%>
<!--product_unitprice is table colomn name -->
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox4" runat="server" ></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
C#:
protected string ChandanIdiot(object ob) {
string typ = ob.ToString(); //selected value stored in ob
if (typ == "some function") {
//do somthing
}
return typ ; //value return to <%# ChandanIdiot( Eval("product_unitprice"))%>
}

Resources