using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace FileDownloader { class Program { static void Main(string[] args) { ListallUrls = GetUrls().Select(x=>x.Trim()).ToList(); Parallel.ForEach(allUrls, new ParallelOptions() { MaxDegreeOfParallelism = 10 }, url => { try { WebRequest request = WebRequest.Create(url); WebResponse response = request.GetResponse(); string originalFileName = response.ResponseUri.AbsolutePath.Substring(response.ResponseUri.AbsolutePath.LastIndexOf("/") + 1); Stream streamWithFileBody = response.GetResponseStream(); using (Stream output = File.OpenWrite(@"C:\Ebooks_New\" + originalFileName)) { streamWithFileBody.CopyTo(output); } Console.WriteLine("Downloded : " + originalFileName); } catch (Exception ex) { Console.WriteLine("Unable to Download : " + ex.ToString()); } }); Console.WriteLine("Finished : ************************"); Console.ReadKey(); } public static List GetUrls() { return new List () // Put list of URLs here { "http://ligman.me/1IW1oab ", "http://ligman.me/1Uixtlq ", "http://ligman.me/1R9Ubgt ", "http://ligman.me/1H4VXHT ", "http://ligman.me/1f8XUKy ", "http://ligman.me/1HBEUPi ", "http://ligman.me/1NDTZR4 ", "http://ligman.me/1Uiy2f9 ", "http://ligman.me/1epZ0QU ", "http://ligman.me/1JIhgjA ", "http://ligman.me/1CQX5uG ", } } } }
Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts
14 July 2017
Download Files in Parallel using C#
I wrote this little utility program that allows you to download multiple files from URLs using C#.
23 October 2015
Call Google Maps Geocode API in Parallel using C# and TPL
Google Maps Geocode API provides a way to validate addresses by getting latitude and longitude and address type of a given address. In this post I would like to show you how to call this web service in parallel so you can speed up the address validation process. One thing to note is URL to get Geocode details from Google Maps API is different if you are only using free version in comparison to when you are using Google Maps API for work. By default Google Maps API provide 2500 request per day for free. When you are calling Google Maps API using paid version you need to encrypt your request using your client ID and encryption key provided to you when you buy it.
First thing first. You will need a key to run this application so sign up for Google Maps API and get your key https://developers.google.com/maps/documentation/geocoding/intro
You can download the full source code from GoogleGeocode.GoogleMapsAPI Source
Setup your app.config file
In AppSettings section add
There is a limit of 10 API calls per second when you are calling Google Maps APIs so I am passing 10 addresses to Parallel.ForEach loop and calling Google Geocode API. This will parallalize API calls. Also there is a check if all API calls finish within one second wait for 1 second before calling next batch to avoid getting QUERY_OVER_LIMIT error.
GetGeoDetails() method calls Google Maps API using HttpRequest and Get HttpResponse object back which then being converted to JSON object using JSON.Net library.
First thing first. You will need a key to run this application so sign up for Google Maps API and get your key https://developers.google.com/maps/documentation/geocoding/intro
You can download the full source code from GoogleGeocode.GoogleMapsAPI Source
Setup your app.config file
In AppSettings section add
<add key="IsGoogleMapsAPIPaid" value="0"/> <add key="URL" value="https://maps.googleapis.com/maps/api/geocode/json?address="/> <add key="APIClient" value="yourclientId"/> <add key="APIKey" value="yourcryptokey"/>In your code you will get a list of addresses you want to validate from your database. In this demo I have put some addresses in a list.
ListlstAddresses = new List () { "UNIT 7, 7 ERINDALE ROAD BALCATTA WA 6021", "226 MCINTYRE ROAD SUNSHINE VIC 3020", "UNIT 1 & 2, 12 PREMIER COURT WARANA QLD 4575", "PETERSHAM NSW 2049", "UNIT 7, 7 ERINDALE ROAD BALCATTA WA 6021", "226 MCINTYRE ROAD SUNSHINE VIC 3020", "UNIT 1 & 2, 12 PREMIER COURT WARANA QLD 4575", "WENTWORTHVILLE NSW 2049", "UNIT 7, 7 ERINDALE ROAD BALCATTA WA 6021", "MCINTYRE ROAD SUNSHINE VIC 3020", "UNIT 1 & 2, 12 PREMIER COURT WARANA QLD 4575", "PETERSHAM NSW 2049" };
There is a limit of 10 API calls per second when you are calling Google Maps APIs so I am passing 10 addresses to Parallel.ForEach loop and calling Google Geocode API. This will parallalize API calls. Also there is a check if all API calls finish within one second wait for 1 second before calling next batch to avoid getting QUERY_OVER_LIMIT error.
Parallel.ForEach(selected, new ParallelOptions() { MaxDegreeOfParallelism = 10 }, sel => { try { string address = sel.ToString(); Console.WriteLine("Address = " + address); GeoDetail objResult = GeoDetail.GetGeoDetails(key, address); lock (lockMe) { lstResult.Add(objResult); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } });
GetGeoDetails() method calls Google Maps API using HttpRequest and Get HttpResponse object back which then being converted to JSON object using JSON.Net library.
public static GeoDetail GetGeoDetails(string APIKey, string address) { string uri = ConfigurationManager.AppSettings["URL"]; GeoDetail objResult = new GeoDetail() { Address = address, Latitude = -1, Longitude = -1, AddressType = "", Error = "" }; try { string requestURL = ""; if (ConfigurationManager.AppSettings["IsGoogleMapsAPIPaid"].Trim() == "0") { requestURL = uri + address + "&key=" + APIKey; // No need to sign URL and there is no APIClient ID to pass. } else { requestURL = GoogleSignedUrl.Sign(uri + address + "&client=" + ConfigurationManager.AppSettings["APIClient"].Trim(), APIKey); } HttpWebRequest request = WebRequest.Create(requestURL) as HttpWebRequest; request.Accept = "application/json"; // Get response using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) { if (response.StatusCode == HttpStatusCode.OK) { StreamReader readert = new StreamReader(response.GetResponseStream()); string x = readert.ReadToEnd(); JObject jObject = JObject.Parse(x); //Console.WriteLine(x); if (jObject["status"].ToString() == "OK")// successful API call { if (jObject["results"].Count() > 0) { string locationType = jObject["results"][0]["geometry"]["location_type"].ToString(); string lat = jObject["results"][0]["geometry"]["location"]["lat"].ToString().Trim(); string lng = jObject["results"][0]["geometry"]["location"]["lng"].ToString().Trim(); Console.WriteLine("Geolocation lat lng : {0} {1} Type : {2}", lat, lng, locationType); double? latValue = null; double? lngValue = null; if (!string.IsNullOrWhiteSpace(lat)) { latValue = double.Parse(lat); } if (!string.IsNullOrWhiteSpace(lng)) { lngValue = double.Parse(lng); } objResult.Latitude = latValue; objResult.Longitude = lngValue; objResult.AddressType = locationType; //locationType == "ROOFTOP")//exact address match } else { Console.WriteLine("No result found"); objResult.Error = "No result found"; } } else { Console.WriteLine(jObject["status"].ToString()); objResult.Error = jObject["status"].ToString(); } } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); objResult.Error = ex.ToString(); } return objResult; }
Labels:
.NET,
C#,
Google Geocode API,
TPL
07 September 2015
Only allow digits in Console Application in C#
If you are writing a console application in C# and you want to restrict user to only enter digits for certain variable there is an option to use ConsoleKeyInfo struct to read each key user input and take action accordingly. This struct provides a way to find which key user has entered in console application and check if it is a number or not using Char.IsNumber() method.
Below is the complete source code that only allow user to enter digits for a field. If user type any other characters it simply ignores them.
Below is the complete source code that only allow user to enter digits for a field. If user type any other characters it simply ignores them.
Console.WriteLine("Enter Numeric Value : "); ConsoleKeyInfo key; string inputStr = ""; do { key = Console.ReadKey(true); if (key.Key != ConsoleKey.Backspace && key.Key != ConsoleKey.Enter) { if (char.IsNumber(key.KeyChar))//Check if it is a number { inputStr += key.KeyChar; Console.Write(key.KeyChar); } } else { if (key.Key == ConsoleKey.Backspace && inputStr.Length > 0) { inputStr = inputStr.Substring(0, (inputStr.Length - 1)); Console.Write("\b \b"); } } } while (key.Key != ConsoleKey.Enter); Console.WriteLine("\nNumber you entered is {0}", inputStr);
04 September 2015
Find Distinct Objects from List of Objects using LINQ
To find distinct values from list of values in C# is a one line task by using LINQ's Distinct() method. This works well with primitive types but if you run the same method on List of custom Objects you will not get distinct objects based on its properties. To achieve this you an option to implement IEqualityComparer interface and use it to find distinct objects based on its properties. In the implementation of Equals method you can define which properties to check for equality.
Below code provides the complete solution to get distinct objects from list of objects.
Below code provides the complete solution to get distinct objects from list of objects.
using System.Collections.Generic; public class Team { public string Name {get;set;} public int Score {get;set;} } //Create some dummy data with duplicates public List<Team> lstTeam = new List<Team>{ new Team{Name="Brazil", Score=1}, new Team{Name="Man U", Score=1}, new Team{Name="Man U", Score=1}, new Team{Name="Brazil", Score=2}, new Team{Name="Man U", Score=2}, new Team{Name="Brazil", Score=2} }; //This is where we use equality comparer implementation to find unique records List<Team> lstDistictTeams = lstTeam.Distinct<Team>(new DistinctComparer()).ToList(); foreach(Team t in lstDistictTeams) // Output Distinct Objects { Console.WriteLine("Team {0} has Score {1}",t.Name,t.Score); } //This class provides a way to compare two objects are equal or not public class DistinctComparer : IEqualityComparer<Team> { public bool Equals(Team x, Team y) { return (x.Name == y.Name && x.Score == y.Score); // Here you compare properties for equality } public int GetHashCode(Team obj) { return (obj.Name.GetHashCode() + obj.score.GetHashCode()); } }
Labels:
.NET,
C#,
Distinct Objects,
LINQ,
List
14 May 2015
Copy Data between two different MSSQL Databases on different servers using C#
You can copy data from one SQL table to another using INSERT command with SELECT within same database or databases on same server but things gets little complicated when databases are on two different server. Here is a C# snipplet you can use to copy data between two desperate databases on two different servers. Code is self explanatory with comments. Your source and destination table fields needs to match.
// Create source connection SqlConnection source = new SqlConnection(ConfigurationManager.ConnectionStrings["SourceConnectionString"].ConnectionString); // Create destination connection SqlConnection destination = new SqlConnection(ConfigurationManager.ConnectionStrings["DestinationConnectionString"].ConnectionString); // Open source and destination connections. source.Open(); destination.Open(); // Select data from Products table SqlCommand cmd = new SqlCommand(@"SELECT customer ,name ,address1 ,address2 ,address3 ,address4 ,address6 ,address5 ,fax ,territory ,region ,class FROM [dbo].[slcustm]", source); // Execute reader Console.WriteLine("Read data from [dbo].[slcustm] table"); SqlDataReader reader = cmd.ExecuteReader(); Console.WriteLine("Write data to DestinationCustomers table"); // Create SqlBulkCopy SqlBulkCopy bulkData = new SqlBulkCopy(destination); //If you are copying larger amount of data don't forget to set the timeout flag. Default value is 30 seconds. 0 = No limit bulkData.BulkCopyTimeout = 0; // Set destination table name bulkData.DestinationTableName = "DestinationCustomers"; // Write data bulkData.WriteToServer(reader); // Close objects bulkData.Close(); destination.Close();
Labels:
.NET,
Bulk Copy Data,
C#,
MSSQL Server,
SQL
03 May 2015
ASP.NET Gridview with Filter in Header using Reflection and LINQ
Introduction
ASP.NETgridview
by default provides facility for sorting
and paging but no inbuilt facility to filter column. This article looks
at possible way to implement filtering function within the Gridview
.
Background
I came across this requirement of having agridview
which allows filtering data from within the gridview
. I also wanted to preserve the sorting and paging of the gridview
. Rather than creating separate panel above
gridview
for each of the fields to filter data, wouldn't it be nice to put a textbox
along with each header column to filter data.This leads me to this solution I derived for it. This may not be the best solution to do it but it definitely works. Our goal is to achieve this.
You can download full source code from : ASP.NET Gridview with Filter in Header Source Code
How It All Works ?
Create ASP.NET Web Application project in Visual Studio. First of all, we will create a DTO class to hold some data that we can display in a gridview. For this demo, I have created a DTO class of outstanding orders that contains some properties and some dummy data.[Serializable] public class Outstanding { public string Item { get; set; } public string Order { get; set; } public int Line { get; set; } public int Status { get; set; } public string ToLocation { get; set; } public decimal Qty { get; set; } public DateTime RegDate { get; set; } public string Location { get; set; } public decimal AllocQty { get; set; } public ListNow in the Default.aspx page, add a gridview. To preserve sorting, add link button in HeaderTemplate with CommandName as "Sort" and CommandArgument as name of the column. Also, for the purpose of filtering the application will bind all the textboxes to single event (OnTextChanged="txtItem_TextChanged" ) and within the event we will determine which textbox fired it and take action accordingly. So columns of the gridview will look like this. I have used different filters like =,>,<,>=&<= for numeric data and "contains" filter for string values.GetOutstanding() { List lstOrders = new List (); lstOrders.Add(new Outstanding() { Item = "CocaCola", Order = "000101", Line = 1, Status = 20, ToLocation = "Sydney", Qty = 2000, RegDate = new DateTime(2014, 1, 1), Location = "USA", AllocQty = 100 }); lstOrders.Add(new Outstanding() { Item = "BubbleGum", Order = "000101", Line = 1, Status = 20, ToLocation = "Sydney", Qty = 2500, RegDate = new DateTime(2014, 1, 11), Location = "USA", AllocQty = 300 }); lstOrders.Add(new Outstanding() { Item = "Coffee", Order = "000111", Line = 1, Status = 50, ToLocation = "Melbourne", Qty = 2500, RegDate = new DateTime(2014, 1, 10), Location = "USA", AllocQty = 100 }); lstOrders.Add(new Outstanding() { Item = "Sugar", Order = "000112", Line = 1, Status = 50, ToLocation = "Melbourne", Qty = 2300, RegDate = new DateTime(2014, 1, 10), Location = "NZ", AllocQty = 300 }); lstOrders.Add(new Outstanding() { Item = "Milk", Order = "000112", Line = 1, Status = 50, ToLocation = "Melbourne", Qty = 2300, RegDate = new DateTime(2014, 1, 10), Location = "NZ", AllocQty = 200 }); lstOrders.Add(new Outstanding() { Item = "Green Tea", Order = "000112", Line = 1, Status = 20, ToLocation = "Melbourne", Qty = 300, RegDate = new DateTime(2014, 1, 10), Location = "NZ", AllocQty = 220 }); lstOrders.Add(new Outstanding() { Item = "Biscuit", Order = "000131", Line = 1, Status = 70, ToLocation = "Perth", Qty = 200, RegDate = new DateTime(2014, 1, 12), Location = "IND", AllocQty = 10 }); lstOrders.Add(new Outstanding() { Item = "Wrap", Order = "000131", Line = 1, Status = 20, ToLocation = "Perth", Qty = 2100, RegDate = new DateTime(2014, 1, 12), Location = "IND", AllocQty = 110 }); return lstOrders; } }
Note : Make sure you name all your textboxes as txtFieldName so when filtering we can remove the txt from the ID of the textbox and then use reflection and LINQ to filter the data.
<asp:TemplateField SortExpression="Item"> <HeaderTemplate> <asp:LinkButton ID="lbItem" runat="server" Text="Item" CommandName="Sort" CommandArgument="Item"></asp:LinkButton> <br /> <asp:TextBox runat="server" ID="txtItem" AutoPostBack="true" OnTextChanged="txtItem_TextChanged"></asp:TextBox> </HeaderTemplate> <ItemTemplate> <%#Eval("Item") %> </ItemTemplate> </asp:TemplateField><asp:TemplateField SortExpression="Line" ItemStyle-HorizontalAlign="Right" HeaderStyle-HorizontalAlign="Right"> <HeaderTemplate> <asp:LinkButton ID="lbLine" runat="server" Text="Line" CommandName="Sort" CommandArgument="Line" CssClass="RightAlign"></asp:LinkButton> <br /> <table> <tr> <td> <asp:DropDownList runat="server" ID="ddlFilterTypeLine" CssClass="upperCaseText"> <asp:ListItem Text="=" Value="=" Selected="True"></asp:ListItem> <asp:ListItem Text=">" Value=">"></asp:ListItem> <asp:ListItem Text=">=" Value=">="></asp:ListItem> <asp:ListItem Text="<" Value="<"></asp:ListItem> <asp:ListItem Text="<=" Value="<="></asp:ListItem> </asp:DropDownList> </td> <td> <asp:TextBox runat="server" ID="txtLine" Width="50" AutoPostBack="true" OnTextChanged="txtItem_TextChanged" CssClass="upperCaseText"></asp:TextBox> </td> </tr> </table></HeaderTemplate> <ItemTemplate> <%#Eval("Line","{0:0}")%> </ItemTemplate> </asp:TemplateField>Now in the Page_Load event, we will bind gridview to the dummy data. I have kept data in ViewState for this demo.
if (!Page.IsPostBack) { Outstanding objOutstanding = new Outstanding(); ListIn the textbox's text change event, we will find out which textbox fired it by looking at the ID of a sender and take action accordingly. Finally, we will bind the data to gridview. To preserve the values in filter after postback, I created a seperate method which gets called everytime postback occurs and set values in corresponding textboxes and filters after postback.lstOutstandingOrders = new List (); lstOutstandingOrders = objOutstanding.GetOutstanding(); ViewState["columnNameO"] = "RegDate"; grdViewOutstanding.DataSource = lstOutstandingOrders; grdViewOutstanding.DataBind(); ViewState["lstOutstandingOrders"] = lstOutstandingOrders; upnlOutstanding.Update(); }
In here what happens is all the textboxes are bound to single event so when even is fired you will first find out which textbox has fired that event and remove txt from the ID of textbox to get the name of the property to filter. x.GetType().GetProperty(filterName).GetValue(x, new object[] { } ) provides the value of associated property from list of objects. This is using reflection to get the property of Outstanding class based on input "filterName" as string value and then get the value of the property from the object and compare it to what is passed in the textbox.
// For Outstanding Orders - Single Event bound to all textboxes protected void txtItem_TextChanged(object sender, EventArgs e) { if (ViewState["lstOutstandingOrders"] != null) { ListResetFilterAndValueOutstanding() method restores values in filter textbox and filter type in dropdown after each postback. All the filter values and filter types are stored in ViewState with key value starting with "O". Make sure you don't store any other data in ViewState with key value starting with "O" because when removing the filter we will remove all the ViewState values starting with "O".allOutstanding = (List )ViewState["lstOutstandingOrders"]; TextBox txtBox = (TextBox)sender; string filterName = txtBox.ID.Substring(3); // remove txt from Textbox ID. You need to make sure that all the textboxes for filtering are named as txtFieldName //Check if there is a dropdown associated with current filter. if (grdViewOutstanding.HeaderRow.FindControl("ddlFilterType" + filterName) != null) { //Get value from filter type dropdown string filtrerType = ((DropDownList)grdViewOutstanding.HeaderRow.FindControl("ddlFilterType" + filterName)).SelectedItem.Value; //Special case for DateTime if (filterName == "RegDate") { DateTime filterValue = DateTime.Parse(txtBox.Text.Trim()); //Use LINQ reflection to find value for the input filer value //x.GetType().GetProperty(filterName).GetValue(x, new object[] { })-- This is the LINQ reflection to get value //x.GetType().GetProperty(filterName) -- This gives you the actual property associated with Outstanding class based on input property name as string value. //Then we call get value to get its acutal value and compare it with what is being passed into textbox if (filtrerType == "=") allOutstanding = allOutstanding.Where(x => DateTime.Parse(x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString()) == filterValue).ToList(); else if (filtrerType == ">") allOutstanding = allOutstanding.Where(x => DateTime.Parse(x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString()) > filterValue).ToList(); else if (filtrerType == ">=") allOutstanding = allOutstanding.Where(x => DateTime.Parse(x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString()) >= filterValue).ToList(); else if (filtrerType == "<") allOutstanding = allOutstanding.Where(x => DateTime.Parse(x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString()) < filterValue).ToList(); else if (filtrerType == "<=") allOutstanding = allOutstanding.Where(x => DateTime.Parse(x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString()) <= filterValue).ToList(); } else // Parse Numbers as decimal { if (filtrerType == "=") allOutstanding = allOutstanding.Where(x => decimal.Parse(x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString()) == decimal.Parse(txtBox.Text.Trim())).ToList(); else if (filtrerType == ">") allOutstanding = allOutstanding.Where(x => decimal.Parse(x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString()) > decimal.Parse(txtBox.Text.Trim())).ToList(); else if (filtrerType == ">=") allOutstanding = allOutstanding.Where(x => decimal.Parse(x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString()) >= decimal.Parse(txtBox.Text.Trim())).ToList(); else if (filtrerType == "<") allOutstanding = allOutstanding.Where(x => decimal.Parse(x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString()) < decimal.Parse(txtBox.Text.Trim())).ToList(); else if (filtrerType == "<=") allOutstanding = allOutstanding.Where(x => decimal.Parse(x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString()) <= decimal.Parse(txtBox.Text.Trim())).ToList(); } //Hold Filter Type in ViewState to preserve what is selected for use during postback ViewState["OFilter" + filterName] = filtrerType; } else // Only string value { allOutstanding = allOutstanding.Where(x => x.GetType().GetProperty(filterName).GetValue(x, new object[] { }).ToString().ToUpper().Contains(txtBox.Text.Trim().ToUpper())).ToList(); } //Hold the filter value in ViewState. This will be used in ResetFilterAndValueOutstanidn() during postback ViewState["O" + filterName] = txtBox.Text.Trim().ToUpper(); ViewState["lstOutstandingOrders"] = allOutstanding; grdViewOutstanding.DataSource = allOutstanding; grdViewOutstanding.DataBind(); ResetFilterAndValueOutstanding(); } }
protected void ResetFilterAndValueOutstanding() { //All the filters and filtervalues are stored in ViewState staring with "O" foreach (var k in ViewState.Keys) { if (k.ToString().StartsWith("O")) { //Check if there is a textbox in GridView Header for this ViewState value. if (grdViewOutstanding.HeaderRow.FindControl("txt" + k.ToString().Substring(1)) != null) { ((TextBox)grdViewOutstanding.HeaderRow.FindControl("txt" + k.ToString().Substring(1))).Text = ViewState[k.ToString()].ToString().ToUpper(); } //Check if there is a dropdownlist in GridView for this ViewState value. if (grdViewOutstanding.HeaderRow.FindControl("ddlFilterType" + k.ToString().Substring(1)) != null) { foreach (ListItem li in ((DropDownList)grdViewOutstanding.HeaderRow.FindControl("ddlFilterType" + k.ToString().Substring(1))).Items) { if (li.Text == ViewState["OFilter" + k.ToString().Substring(1)].ToString()) li.Selected = true; else li.Selected = false; } } } } }Add a link button on top of the gridview called "Remove Filter" which will remove all the ViewState with keys starting with "O" and rebind gridview to data and reset all filters to its original values.
protected void lbRemoveFilterOutstanding_Click(object sender, EventArgs e) { //Find all the ViewState Keys starting with "O". This represents Filters and Filter Values ListThere is paging and sorting enabled on the gridview which is easy to understand. This is one of the way to implement filtering on a gridview with paging and sorting.lstKeysToRemove = new List (); foreach (var k in ViewState.Keys) { if (k.ToString().StartsWith("O")) { lstKeysToRemove.Add(k.ToString()); } } foreach (string key in lstKeysToRemove) { ViewState.Remove(key); } Outstanding objOutstanding = new Outstanding(); List lstOutstandingOrders = new List (); lstOutstandingOrders = objOutstanding.GetOutstanding(); grdViewOutstanding.DataSource = lstOutstandingOrders; grdViewOutstanding.DataBind(); ViewState["lstOutstandingOrders"] = lstOutstandingOrders; }
Happy Coding !!!
23 May 2010
Show Session Timeout countdown on ASP.NET page
Hi,
I came across a really nice feature that you can use in ASP.NET to show session timeout to users. This provides rich user experience. I used javascript to create this facility. Hope this will help someone looking for the solution.
add a span named countDown to the page where you want to display this session timeout message. If you want it to display on all the pages once user is logged in then put it in Master page and voila !!! Your session timeout message will be there to warn user.
I came across a really nice feature that you can use in ASP.NET to show session timeout to users. This provides rich user experience. I used javascript to create this facility. Hope this will help someone looking for the solution.
var timeout = '<%= Session.Timeout * 60 * 1000 %>'; var timer = setInterval(function() { timeout -= 1000; document.getElementById('countDown').innerHTML = time(timeout); if (timeout == 0) { clearInterval(timer); alert('Your session has expired!') } }, 1000); function two(x) { return ((x > 9) ? "" : "0") + x } function time(ms) { var t = ''; var sec = Math.floor(ms / 1000); ms = ms % 1000 var min = Math.floor(sec / 60); sec = sec % 60; t = two(sec); var hr = Math.floor(min / 60); min = min % 60; t = hr+":"+two(min) + ":" + t; return "You session will timeout in " + t ; }
add a span named countDown to the page where you want to display this session timeout message. If you want it to display on all the pages once user is logged in then put it in Master page and voila !!! Your session timeout message will be there to warn user.
<span id="countDown"> </span>
14 April 2010
Creating Custom Membership Provider for Login Control in ASP.NET
You may have came across the situation where you want to use .NET's membership provider facility but don't want to use tables and stored procedures generated by aspnet_regsql.exe . You want to use your own simple Users table in your own database with just few fields like UserID, Password and Role. It may seems like a big task to create your own Membership Provider to use your own login logic but it is not that hard. Just follow the steps below :
1 > Create your own Membership Provider Class and inherit it from base MembershipProvider class. If you are using VB.NET the needed methods are added automatically. If you are using C# just right click the MembershipProvider class and add the properties and methods . Don't forget to import System.Configuration.Provider namespace.
The IDE will generate all the methods and properties and you don't have to implement all of them.
The only method that you need to implement is ValidateUser(string username, string password)
You can leave all the other methods throw an exception unless you explicitly want the facility provided by non implemented method.
2 > Add CustomeMemberShip Provider to your web.config
3.> Add Membership Provider for your login control on Login.aspx page.
In the Properties window of the Login control set MembershipProvider to your MyCustomeMembershipProvider class.
That is it.
Off you go to your own login logic with custom membership provider.
1 > Create your own Membership Provider Class and inherit it from base MembershipProvider class. If you are using VB.NET the needed methods are added automatically. If you are using C# just right click the MembershipProvider class and add the properties and methods . Don't forget to import System.Configuration.Provider namespace.
The IDE will generate all the methods and properties and you don't have to implement all of them.
The only method that you need to implement is ValidateUser(string username, string password)
You can leave all the other methods throw an exception unless you explicitly want the facility provided by non implemented method.
public class MyCustomMemershipProvider : MembershipProvider { public int TryLogin(string id, string pass) // My own login method { int roleId = 0; DatabaseUtilityHelper databaseHelper = new DatabaseUtilityHelper(); SqlConnection con = databaseHelper.GetBBCDatabaseConnection(); SqlParameter[] agentParams = new SqlParameter[] { new SqlParameter("@UserId",id), new SqlParameter("@Password",pass)}; con.Open(); SqlDataReader reader = DatabaseUtility.ExecuteReader(con, "login_user", CommandType.StoredProcedure, agentParams); if (reader.Read()) { roleId = Int32.Parse(reader.GetSqlValue(1).ToString()); } else { roleId = 0; } con.Close(); return roleId; } public override string ApplicationName { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } ..... ..... // Generated Code .... .... public override bool ValidateUser(string username, string password) { int result = TryLogin(username, password); if (result > 0) { return true; } else { return false; } }
2 > Add CustomeMemberShip Provider to your web.config
<membership defaultProvider="MyCustomMemershipProvider"> <providers> <clear/> <add name="MyCustomMemershipProvider" type="BBCApplication.BusinessLogic.MyCustomMemershipProvider"/> </providers> </membership>
3.> Add Membership Provider for your login control on Login.aspx page.
In the Properties window of the Login control set MembershipProvider to your MyCustomeMembershipProvider class.
That is it.
Off you go to your own login logic with custom membership provider.
Subscribe to:
Posts (Atom)