EW Resource

ASP.Net Code Tips

The code tips below apply mainly to Visual Studio but can be used with Expression Web if you are adding code by hand.


Referencing Controls inside templates

If you try to reference controls inside FormView templates for instance, you'll find that you get 'not declared' errors.

To reference 'interior' controls you need to use 'FindControl'. For example if we have an upload button inside a FormView template, FormView1, with an id of 'btnUpload', we would do the following (in VB):

Dim upLoadBtn As Button = FormView1.FindControl("btnUpload")

We can then work with this newly defined button as normal.

Adding items to a databound DropDownList

It's common to populate a drop down list from a database table or xml file. You may need to add an initial item that invites the user to select from the list. This can be done on the page or via script by using the AppendDataBoundItem property.

On the page:

<asp:DropDownList ID="DropDownList1" runat="server"
DataTextField="widgetName" DataValueField="widgetID"
<asp:ListItem Value="">Select a widget</asp:ListItem>

In script (VB)

Dim li As New System.Web.UI.WebControls.ListItem

li.Value = 0
li.Text = "Select a widget"

DropDownList1.Items.Insert(0, li)

DropDownList1.AppendDataBoundItems = True

Going to a page anchor after post-back

Pages always re-load at the top after post-back. If you have results of some kind at the bottom of the page the user may miss them and it would be useful to be able to go to an anchor tag in the results to avoid this happening. There's no built in property which allows you to do this but it's relatively simple to do.

At the top or bottom  of the results as appropriate, place an asp textbox with zero width and a zero width border. Name it txtAnchor or similar.

Then, in your function that generates the results, or in you page load subroutine, put "txtAnchor.focus()" as the final statement.

Now, when the page re-loads, the focus goes to this invisible text box and you've achieved the desired effect.

Changing colours to user defined values

If you set the colour of a GridView row for instance, you would use something like:

GridView1.RowStyle.BackColor = Drawing.Color.White .

Doing this you are limited to the list of available drawing colours. To get over this you need to use:

Drawing.Color.FromArgb(R, G, B)  .

For example:

Drawing.Color.FromArgb(83, 212, 83)

Dynamically Changing cell colours in a GridView

You may need to change the background colour of a GridView cell dynamically, where the colour depends on its value.

In this example the colour is changed depending on the value of a 'Status' field.

Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowCreated

If e.Row.RowType = DataControlRowType.DataRow Then

Dim strStatus = System.Web.UI.DataBinder.Eval(e.Row.DataItem, "status")

If strStatus Is System.DBNull.Value Then

e.Row.Cells(6).BackColor = Drawing.Color.White


Select Case strStatus

Case "Complete"
e.Row.Cells(6).BackColor = Drawing.Color.FromArgb(204, 255, 204)

Case "Cancelled" 
e.Row.Cells(6).BackColor = Drawing.Color.Silver

Case "New" 
e.Row.Cells(6).BackColor = Drawing.Color.FromArgb(255, 204, 153)

Case Else
e.Row.Cells(6).BackColor = Drawing.Color.White

End Select

End If

End If

End Sub

Default messages for empty DataLists and Repeaters

Unlike the GridView, FormView or DetailsView, the DataList has no EmptyDataTemplate. To provide a default message when there is no data, add a label above the DataList with a suitable message and set it's visibility to 'false'.

Then add the following in your Page_Load sub:

If DataList1.Items.Count = 0 Then

lblMessage.visible = True

End If

Similarly for a Repeater:

Add a default message for no data in a label above the repeater and set it's visibility to 'false'. We then need to force the repeaters databind method before we check for data. (This would otherwise occur later in the page lifecycle).

In your Page_Load sub:


If Repeater1.Items.Count = 0 Then

lblMessage.visible = true

End If

Formatting a Repeater DataItem for currency

There are several ways to apply a currency format to a data item in a Repeater, one of the simplest is:

<%#DataBinder.GetPropertyValue(Container.DataItem, "bPrice", "{0:c0}")%>

Here 'bPrice' is the table column and is formatted to local currency with no decimal places. eg £1200 rather than £1200.00