Monday, October 17, 2011
Modify Query String
If you build a hyperlink on a web page dynamically, sometimes you may need to append or modify an existing query string.
To modify a url with an existing query string, first grab the AbsoluteUrl property:
string path = Request.Url.AbsolutePath ;
This will give you a url wihout the query string portion.
If you need to reuse an existing portion of the query string, you have to get it yourself, e.g:
string key = Request.QueryString["key"];
string path = Request.Url.AbsolutePath + "?key="+ key;
Now, you can build your url:
string url = path+ "&key2="+ myValue;
Related posts:
Add JavaScript Dynamically to ASP.NET UpdatePanel
Examine Columns in ASP.NET Dynamic Data MetaTable
Thursday, October 13, 2011
Find GridView Column Index
If you create GridView columns dynamically using the AutogenerateColumns = true feature, sometimes you need to find a column index from the column name.
I created an extension method to find a column index:
This is how you call from the RowDataBound event handler:
I created an extension method to find a column index:
public static int GetIndex(this DataRowView tableData, string fieldName) { DataColumn dc = tableData.DataView.Table.Columns[fieldName]; if (dc != null) { return dc.Ordinal; } return -1; }
This is how you call from the RowDataBound event handler:
DataRowView tableData = e.Row.DataItem as DataRowView; int pos = tableData.GetIndex("MyFieldName"); if (pos != -1){ //do your thing }
Wednesday, July 27, 2011
Thursday, March 17, 2011
Check QueryString for Null
If you need to determine whether the Request.QueryString is null and take some action depending on the result, it is not enough to check for null. QueryString is an HttpValueCollection type, so even if the Request.Url does not have a query string appended to it, the value of the collection is not going to be null. The proper way to check if the query string contains anything is to check for null and the Count property as well:
if(Request.QueryString!= null && Request.QueryString.Count>0){
//some piece of code.
}Friday, December 3, 2010
C# Delegates as Method Parameters
Let's say you have 2 methods that go through similar steps:
These 2 methods essentially do the same thing. First, they check for some condition, and if the condition evaluates to true, they call another method, set some properties, and return a string. We can use C# delegates to refactor these 2 methods into one. Here is how you do it:
Declare 2 delegates whose signature matches the methods we want to replace:
Create a method that will use the delegates:
An alternative method signature is as follows:
This way we don't have to declare delegates separately.
Now, we can call the new method, passing the methods that we called before refactoring, as parameters:
An interesting discussion of delegates can be found on the stackflow.
public string GetPrevItem()
{
if (IsValidPrevEntry())
{
string item = GetPrevString();
SetProperties();
return item;
}
else
return null;
}
public string GetNextItem()
{
if (IsValidNextEntry())
{
string item = GetNextString();
SetProperties();
return item;
}
else
return null;
}
Declare 2 delegates whose signature matches the methods we want to replace:
delegate bool IsValid();
delegate string GetItem();
private string GetMyItem(IsValid isValid, GetItem getItem)
{
if (isValid())
{
string item = getItem();
SetEventProperties();
return item;
}
else
return null;
}
private string GetNavItem(Func<bool> isValid, Func<string> getItem)
Now, we can call the new method, passing the methods that we called before refactoring, as parameters:
string strPrev = GetMyItem(IsValidPrevEntry, GetPrevString);
string strNext = GetMyItem(IsValidNextEntry, GetNextString);
Tuesday, November 16, 2010
Add JavaScript Dynamically to ASP.NET UpdatePanel
Use the following example:
What it does is attaches a JavaScript function (defined elsewhere) to each input box on the page on the key press event, and then registers it for use with a control that is inside an UpdatePanel. This could be used for user input validation. The code has been verified in IE and Firefox.
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append(@" var inputs = document.getElementsByTagName('input'); for (var i = 0; i < inputs.length; i++) {
if (inputs[i].type == 'text') {
inputs[i].onkeypress = function (event) {
event = event || window.event;
return myJavaScriptFunction(event);}
event = event || window.event;
return myJavaScriptFunction(event);}
}}"
);
What it does is attaches a JavaScript function (defined elsewhere) to each input box on the page on the key press event, and then registers it for use with a control that is inside an UpdatePanel. This could be used for user input validation. The code has been verified in IE and Firefox.
Wednesday, November 10, 2010
ASP.NET GridView Subclass with Dynamic Footer Totals
A frequent requirement when using an ASP.NET GridView on a web page is to have a footer with totals for numeric columns in the GridView. Here is a GridView subclass that calculates footer totals dynamically. It requires 3 parameters:
FirstComputedColumnIndex - the for index of the first column in the data set to be computed
FirstVisbleComputedColumnIndex - for the index of the first computed column to be shown
NumberOfComputedColumns - for the number of computed columns.
Here is the class code:
The Indexer class can be nested within the GridView subclass.
The last example shows how to use the custom GridView on a ASP.NET web page:
First, use the register tag:
<%@ Register Namespace="Eric.TotalGrid" TagPrefix="x" Assembly="TotalGrid" %>
Then, use it just like any other GridView:
<x:GridView runat="server" ....
FirstComputedColumnIndex="4" FirstVisbleComputedColumnIndex="3" NumberOfComputedColumns="10" >
FirstComputedColumnIndex - the for index of the first column in the data set to be computed
FirstVisbleComputedColumnIndex - for the index of the first computed column to be shown
NumberOfComputedColumns - for the number of computed columns.
Here is the class code:
namespace Eric.TotalGrid {
public partial class GridView : System.Web.UI.WebControls.GridView
{
private Indexer footerTotals;
public int FirstComputedColumnIndex { get; set; }
public int FirstVisbleComputedColumnIndex { get; set; }
public int NumberOfComputedColumns { get; set; }
protected override void OnLoad(EventArgs e)
{
ShowFooter = true;
base.OnLoad(e);
}
protected override void OnInit(EventArgs e)
{
footerTotals = new Indexer(NumberOfComputedColumns);
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.RowDataBound += new GridViewRowEventHandler(this.GridView1_RowDataBound);
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
DataRowView tableData = e.Row.DataItem as DataRowView;
if (e.Row.RowType == DataControlRowType.DataRow)
{
for (int i = FirstComputedColumnIndex; i < (FirstComputedColumnIndex + NumberOfComputedColumns); i++)
{
if (tableData[i] != DBNull.Value)
{
decimal result = 0;
if (Decimal.TryParse(tableData[i].ToString(), out result))
{
footerTotals[i - FirstComputedColumnIndex] += result;
}
}
}
}
else if (e.Row.RowType == DataControlRowType.Footer)
{
for (int i = 0; i < NumberOfComputedColumns; i++)
{
if (e.Row.Cells.Count > (i + FirstVisbleComputedColumnIndex))
e.Row.Cells[i + FirstVisbleComputedColumnIndex].Text = footerTotals[i].ToString();
}
}
}
}
The key to this GridView is using an Indexer class that can be accessed like an array. Here is its listing:
}
The key to this GridView is using an Indexer class that can be accessed like an array. Here is its listing:
class Indexer
{
private int _upperLimit;
private decimal[] myArray;
public Indexer(int limit)
{
_upperLimit = limit;
myArray = new decimal[_upperLimit];
}
public decimal this[int index] // Indexer declaration
{
get
{
// Check the index limits.
if (index < 0 || index >= _upperLimit)
return 0;
else
return myArray[index];
}
set
{
if (!(index < 0 || index >= _upperLimit))
myArray[index] = value;
}
}
}
The last example shows how to use the custom GridView on a ASP.NET web page:
First, use the register tag:
<%@ Register Namespace="Eric.TotalGrid" TagPrefix="x" Assembly="TotalGrid" %>
Then, use it just like any other GridView:
<x:GridView runat="server" ....
FirstComputedColumnIndex="4" FirstVisbleComputedColumnIndex="3" NumberOfComputedColumns="10" >
Subscribe to:
Posts (Atom)