Find Control of a Type in WPF
I had previously written a piece of Code to retrieve a control of a single type in ASP.net, now working on WPF I had to do basically the same thing, and VisualTreeHelper came to the rescue.
In this process I discovered that if the content of the user control/window is a scroll panel you have to reference the scroll panel. so without further blabber , here is the code. (Please Note that this also works with controls inside a groupbox)
public static class VisualEnumerable { /// <summary> /// Gets the Visual Tree filtered by Type for a DependencyObject with that DependencyObject as the root. /// </summary> public static IEnumerable<t> GetVisualOfType</t><t>(this DependencyObject element) { var temp = GetVisualTree(element).ToList(); return temp.Where(t => t.GetType() == typeof(T)).Cast</t><t>(); } /// <summary> /// Gets the Visual Tree for a DependencyObject with that DependencyObject as the root. /// </summary> public static IEnumerable<dependencyobject> GetVisualTree(this DependencyObject element) { int childrenCount = VisualTreeHelper.GetChildrenCount(element); for (int i = 0; i < childrenCount; i++) { var visualChild = VisualTreeHelper.GetChild(element, i); if (visualChild != null) yield return visualChild; if (visualChild is GroupBox) { var gb = visualChild as GroupBox; object gpChild = gb.Content; yield return visualChild; visualChild = (DependencyObject)gpChild; } foreach (var visualChildren in GetVisualTree(visualChild)) { yield return visualChildren; } } } }
To Use this you can simply do
var textboxes = this.MainPanel.GetVisualOfType<textbox>() </textbox>
Recover Jobs from a crashed SQL Server
I recently came across the scenario where a SQL server had crashed (with Windows) but the file system was intact, so we started restore of databases which was straight forward as easy as attaching to the new instance on different server. But we also had lot of jobs scheduled on the old server, and wanted to recover them as well, so after a doing a bit of search figured out that the jobs are saved in “msdb” system database.
- Create a dummy instance of SQL Server.
- Stop the instance.
- Replace the .mdf & .ldf files from the crashed server of the msdb database.
- Start the Server Instance as well as agent.
- voila, you have your jobs, now script those jobs and execute on new server
and you are good to go..
Nifty Little script to check identity columns
I had to recently check for identity specification on all the tables in a database and this nifty little script helped me in doing this.
CREATE PROC dbo.CheckIdentities AS BEGIN SET NOCOUNT ON SELECT QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) AS TableName, c.name AS ColumnName, CASE c.system_type_id WHEN 127 THEN 'bigint' WHEN 56 THEN 'int' WHEN 52 THEN 'smallint' WHEN 48 THEN 'tinyint' END AS 'DataType', IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) AS CurrentIdentityValue, CASE c.system_type_id WHEN 127 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 9223372036854775807 WHEN 56 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 2147483647 WHEN 52 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 32767 WHEN 48 THEN (IDENT_CURRENT(SCHEMA_NAME(t.schema_id) + '.' + t.name) * 100.) / 255 END AS 'PercentageUsed' FROM sys.COLUMNS AS c INNER JOIN sys.TABLES AS t ON t.[object_id] = c.[object_id] WHERE c.is_identity = 1 ORDER BY PercentageUsed DESC END
Asp.net ReportViewer : Access Remote Server Report with Credentials
If you want to work with remote SSRS report while debugging your asp.net application you would want to authenticate with the remote server, you cannot use asp.net impersonation as this would actually make the entire application run under impersonation so to solve this we can use impersonation for the report viewer only to do this :
#if (DEBUG) this.ReportViewer1.ServerReport.ReportServerCredentials = new ReportServerCredentials("username", "password","domain"); #endif
and a ReportServerCredentials class
public class ReportServerCredentials : IReportServerCredentials { private string _userName; private string _password; private string _domain; public ReportServerCredentials(string userName, string password, string domain) { _userName = userName; _password = password; _domain = domain; } public System.Security.Principal.WindowsIdentity ImpersonationUser { get { return null; } } public System.Net.ICredentials NetworkCredentials { get { return new System.Net.NetworkCredential(_userName, _password, _domain); } } bool IReportServerCredentials.GetFormsCredentials(out Cookie authCookie, out string userName, out string password, out string authority) { authCookie = null; userName = _userName; password = _password authority = _domain; return false; } }
Reset your SQL Server login
Recently I faced a situation where the SQL Server was setup but no one knew the login, and the SQL server was not configured in Mixed Mode Authentication, so how do you recover from this situation other than re installing the instance,
Stop the running instance and then open up command prompt in Binn directory on the instance which would be something like
c:\Program Files\Microsoft SQL Server\MSSQL...\Binn
Run the following command
sqlservr.exe -m"SQLCMD"
This would start the instance in single user mode, now open up another command prompt in the same directory
and then run “SQLCMD”
and execute the following statements based on requirement
If you want to add a windows user use
CREATE login [DOMAIN\USERNAME] FROM windows; EXEC sys.sp_addsrvrolemember @loginame = N'DOMAIN\USERNAME', @rolename = N'sysadmin'; GO;
To add a SQL Server Login use (remember this works only if mixed mode authentication is enabled)
CREATE LOGIN [testAdmin] WITH PASSWORD=N'test@1234', DEFAULT_DATABASE=[master]; EXEC sys.sp_addsrvrolemember @loginame = N'testAdmin', @rolename = N'sysadmin'; GO;
now exit SQLCMD and also do CTRL+C on first window to stop instance and restart the instance in regular mode.
Zune Window in WPF
I have become a huge fan of Metro UI design and i really like the Zune interface and the starting point would be the custom chrome so i searched a bit and found this neat little thing , thought I would share
/// <summary> /// Borderless Window Behavior /// </summary> public class BorderlessWindowBehavior : Behavior<window> { #region Native Methods [StructLayout(LayoutKind.Sequential)] public struct MARGINS { public int leftWidth; public int rightWidth; public int topHeight; public int bottomHeight; } [DllImport("dwmapi.dll")] private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset); /// <summary> /// POINT aka POINTAPI /// </summary> [StructLayout(LayoutKind.Sequential)] public struct POINT { /// <summary> /// x coordinate of point. /// </summary> public int x; /// <summary> /// y coordinate of point. /// </summary> public int y; /// <summary> /// Construct a point of coordinates (x,y). /// </summary> public POINT(int x, int y) { this.x = x; this.y = y; } } [StructLayout(LayoutKind.Sequential)] public struct MINMAXINFO { public POINT ptReserved; public POINT ptMaxSize; public POINT ptMaxPosition; public POINT ptMinTrackSize; public POINT ptMaxTrackSize; }; /// <summary> /// </summary> [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class MONITORINFO { public int cbSize = Marshal.SizeOf(typeof(MONITORINFO)); public RECT rcMonitor = new RECT(); public RECT rcWork = new RECT(); public int dwFlags = 0; } /// <summary> Win32 </summary> [StructLayout(LayoutKind.Sequential, Pack = 0)] public struct RECT { /// <summary> /// Win32 /// </summary> public int left; /// <summary> /// Win32 /// </summary> public int top; /// <summary> /// Win32 /// </summary> public int right; /// <summary> /// Win32 /// </summary> public int bottom; /// <summary> /// Win32 /// </summary> public static readonly RECT Empty = new RECT(); /// <summary> /// Win32 /// </summary> public int Width { // Abs needed for BIDI OS get { return Math.Abs(right - left); } } /// <summary> /// Win32 /// </summary> public int Height { get { return bottom - top; } } /// <summary> /// Win32 /// </summary> /// <param name="left">The left.</param> /// <param name="top">The top.</param> /// <param name="right">The right.</param> /// <param name="bottom">The bottom.</param> public RECT(int left, int top, int right, int bottom) { this.left = left; this.top = top; this.right = right; this.bottom = bottom; } /// <summary> /// Win32 /// </summary> /// <param name="rcSrc">The rc SRC.</param> public RECT(RECT rcSrc) { this.left = rcSrc.left; this.top = rcSrc.top; this.right = rcSrc.right; this.bottom = rcSrc.bottom; } /// <summary> /// Win32 /// </summary> /// <value> /// <c>true</c> if this instance is empty; otherwise, <c>false</c>. /// </value> public bool IsEmpty { get { // BUGBUG : On Bidi OS (hebrew arabic) left > right return left >= right || top >= bottom; } } /// <summary> /// Return a user friendly representation of this struct /// </summary> /// <returns> /// A <see cref="System.String"/> that represents this instance. /// </returns> public override string ToString() { if (this == RECT.Empty) return "RECT {Empty}"; return String.Format("RECT {{ left : {0} / top : {1} / right : {2} / bottom : {3} }}", left, top, right, bottom); } /// <summary> /// Determine if 2 RECT are equal (deep compare) /// </summary> /// <param name="obj">The <see cref="System.Object"/> to compare with this instance.</param> /// <returns> /// <c>true</c> if the specified <see cref="System.Object"/> is equal to this instance; otherwise, <c>false</c>. /// </returns> public override bool Equals(object obj) { if (!(obj is Rect)) return false; return (this == (RECT)obj); } /// <summary> /// Return the HashCode for this struct (not guaranteed to be unique) /// </summary> /// <returns> /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. /// </returns> public override int GetHashCode() { return left.GetHashCode() + top.GetHashCode() + right.GetHashCode() + bottom.GetHashCode(); } /// <summary> /// Determine if 2 RECT are equal (deep compare) /// </summary> /// <param name="rect1">The rect1.</param> /// <param name="rect2">The rect2.</param> /// <returns> /// The result of the operator. /// </returns> public static bool operator ==(RECT rect1, RECT rect2) { return (rect1.left == rect2.left && rect1.top == rect2.top && rect1.right == rect2.right && rect1.bottom == rect2.bottom); } /// <summary> /// Determine if 2 RECT are different (deep compare) /// </summary> /// <param name="rect1">The rect1.</param> /// <param name="rect2">The rect2.</param> /// <returns> /// The result of the operator. /// </returns> public static bool operator !=(RECT rect1, RECT rect2) { return !(rect1 == rect2); } } /// <summary> /// Gets the monitor info. /// </summary> /// <param name="hMonitor">The h monitor.</param> /// <param name="lpmi">The lpmi.</param> /// <returns></returns> [DllImport("user32")] internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi); /// <summary> /// Monitors from window. /// </summary> /// <param name="handle">The handle.</param> /// <param name="flags">The flags.</param> /// <returns></returns> [DllImport("User32")] internal static extern IntPtr MonitorFromWindow(IntPtr handle, int flags); /// <summary> /// Wms the get min max info. /// </summary> /// <param name="hwnd">The HWND.</param> /// <param name="lParam">The l param.</param> private static void WmGetMinMaxInfo(System.IntPtr hwnd, System.IntPtr lParam) { MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); // Adjust the maximized size and position to fit the work area of the correct monitor int MONITOR_DEFAULTTONEAREST = 0x00000002; System.IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); if (monitor != System.IntPtr.Zero) { MONITORINFO monitorInfo = new MONITORINFO(); GetMonitorInfo(monitor, monitorInfo); RECT rcWorkArea = monitorInfo.rcWork; RECT rcMonitorArea = monitorInfo.rcMonitor; mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left); mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top); mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left); mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top); } Marshal.StructureToPtr(mmi, lParam, true); } /// <summary> /// Defs the window proc. /// </summary> /// <param name="hwnd">The HWND.</param> /// <param name="msg">The MSG.</param> /// <param name="wParam">The w param.</param> /// <param name="lParam">The l param.</param> /// <returns></returns> [DllImport("user32.dll")] public static extern IntPtr DefWindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam); #endregion private const int WM_NCCALCSIZE = 0x83; private const int WM_NCPAINT = 0x85; private const int WM_NCACTIVATE = 0x86; private const int WM_GETMINMAXINFO = 0x24; private HwndSource m_hwndSource; private IntPtr m_hwnd; public static DependencyProperty ResizeWithGripProperty = DependencyProperty.Register("ResizeWithGrip", typeof(bool), typeof(BorderlessWindowBehavior), new PropertyMetadata(true)); /// <summary> /// Gets or sets a value indicating whether [resize with grip]. /// </summary> /// <value> /// <c>true</c> if [resize with grip]; otherwise, <c>false</c>. /// </value> public bool ResizeWithGrip { get { return (bool)GetValue(ResizeWithGripProperty); } set { SetValue(ResizeWithGripProperty, value); } } /// <summary> /// Called after the behavior is attached to an AssociatedObject. /// </summary> protected override void OnAttached() { if (AssociatedObject.IsInitialized) AddHwndHook(); else AssociatedObject.SourceInitialized += AssociatedObject_SourceInitialized; AssociatedObject.WindowStyle = WindowStyle.None; AssociatedObject.ResizeMode = ResizeWithGrip ? ResizeMode.CanResizeWithGrip : ResizeMode.CanResize; base.OnAttached(); } /// <summary> /// Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred. /// </summary> protected override void OnDetaching() { RemoveHwndHook(); base.OnDetaching(); } /// <summary> /// Adds the HWND hook. /// </summary> private void AddHwndHook() { m_hwndSource = HwndSource.FromVisual(AssociatedObject) as HwndSource; m_hwndSource.AddHook(HwndHook); m_hwnd = new WindowInteropHelper(AssociatedObject).Handle; } /// <summary> /// Removes the HWND hook. /// </summary> private void RemoveHwndHook() { AssociatedObject.SourceInitialized -= AssociatedObject_SourceInitialized; m_hwndSource.RemoveHook(HwndHook); } /// <summary> /// Handles the SourceInitialized event of the AssociatedObject control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> private void AssociatedObject_SourceInitialized(object sender, EventArgs e) { AddHwndHook(); } /// <summary> /// HWNDs the hook. /// </summary> /// <param name="hWnd">The h WND.</param> /// <param name="message">The message.</param> /// <param name="wParam">The w param.</param> /// <param name="lParam">The l param.</param> /// <param name="handled">if set to <c>true</c> [handled].</param> /// <returns></returns> private IntPtr HwndHook(IntPtr hWnd, int message, IntPtr wParam, IntPtr lParam, ref bool handled) { IntPtr returnval = IntPtr.Zero; switch (message) { case WM_NCCALCSIZE: /* Hides the border */ handled = true; break; case WM_NCPAINT: { if (Environment.OSVersion.Version.Major >= 6) { var m = new MARGINS { bottomHeight = 1, leftWidth = 1, rightWidth = 1, topHeight = 1 }; DwmExtendFrameIntoClientArea(m_hwnd, ref m); } handled = true; } break; case WM_NCACTIVATE: { /* As per http://msdn.microsoft.com/en-us/library/ms632633(VS.85).aspx , "-1" lParam * "does not repaint the nonclient area to reflect the state change." */ returnval = DefWindowProc(hWnd, message, wParam, new IntPtr(-1)); handled = true; } break; case WM_GETMINMAXINFO: /* From Lester's Blog (thanks @aeoth): * http://blogs.msdn.com/b/llobo/archive/2006/08/01/maximizing-window-_2800_with-windowstyle_3d00_none_2900_-considering-taskbar.aspx */ WmGetMinMaxInfo(hWnd, lParam); handled = true; break; } return returnval; } } } </window>
Reading Metadata of the Buddy Class
Most of the time we would be using buddy classes for putting metadata for auto generated classes, for example:
Say if this is the autogenerated class
public partial class Person { public string FirstName { ..... } public string LastName {..... } public int Age { ..... } }
Our buddy class would be
public class PersonMetaData { [Display(Name="First Name")] public string FirstName { get; set; } [Display(Name="Last Name")] public string LastName { get; set; } [Display(Name="Age")] public int Age { get; set; } }
This is fine but what if we want to read this data back, if we use the Class.GetProperties() we do not get this data back so basically we would have to go through a hoop, but its fairly simple
PropertyInfo[] headerInfo = typeof(Person).GetProperties(); var attributesofclass = typeof(Person).GetCustomAttributes(true); for (int n = 0; n < headerInfo.Length; n++) { var attributesofbase = (System.ComponentModel.DataAnnotations.DisplayAttribute[])headerInfo[n].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute),true); if (attributesofbase.Count()== 0){ var medatadataofclass = (System.ComponentModel.DataAnnotations.MetadataTypeAttribute[])typeof(T).GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.MetadataTypeAttribute), true); if (medatadataofclass.Count() > 0) { var metadatatypeofclass = medatadataofclass.First().MetadataClassType.GetProperty(headerInfo[n].Name); if (metadatatypeofclass != null){ var metadataofproperty = (System.ComponentModel.DataAnnotations.DisplayAttribute[])metadatatypeofclass.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), true); } } } }
Asp.net Dyanamic Data : A leap for RAD
I have always basically forms over data for the longest period of time (LOB Apps) and most of the time its the same thing over and over again, Setup Database, create scaffolding forms for all the master tables and then move to the next steps, but wait there should be an easy way to this, In the MVC framework you can generate pages based on the model, but there are still a few things that you should wire up manually, enter dynamic data template and this feels like a magical unicorn at the beginning and once you dig deep into into it, its just beautiful, and will save a lot of steps for you.
So lets begin
You have 2 options a Linq2SQL based Application or Entity Framework based application and its just a matter of your preference, Then just create a data Context, This is what i did just to go through and this is not a perfect data model but you can get the point, just create your data context you are almost good to go
then you ll have to uncomment a single line in global.asax
DefaultModel.RegisterContext(typeof(DataModel), new ContextConfiguration() { ScaffoldAllTables = true });
Here the default property for ScaffoldAllTables is false, change it to true if you want scaffolding on all tables, (for now)
and you are done
And this is what you get , Projects and Tasks along with filter and foreign key correctly linked
Now lets customize this a little bit, we would never want all the scaffold all tables and also we would need some validation and hearer names to be changed a bit.
To Scaffold specific tables we will have to mark the tables with [ScaffoldTable(true)] property, and as the Datacontext generated classes are partials we can extend the classes in a seperate file also to provide metadata we will use data annotations and mark all the necessary fields with the required information
namespace TestApplication { [ScaffoldTable(true)] [MetadataType(typeof(Attributes.Project))] public partial class Project { } [ScaffoldTable(true)] [MetadataType(typeof(Attributes.Task))] public partial class Task { } namespace Attributes { public partial class Project { [Required] [StringLength(50, MinimumLength = 5)] [Display(Name = "Project Name")] public string ProjectName { get; set; } } public partial class Task { [Required] [Display(Name = "Project", Order = 0)] public Project Project { get; set; } [Required] [Display(Name = "Employee Code", Order = 1, GroupName = "Employee")] public string EmployeeCode { get; set; } [Required] [Display(Name = "Track Date", Order = 2, GroupName = "Date & Time")] public DateTime TrackDate { get; set; } [Required] [Display(Name = "Hours", Order = 3, GroupName = "Date & Time")] public decimal TaskHours { get; set; } [Required] [Display(Name = "Task Descriprion", Order = 4, GroupName = "Information")] public string TaskDescriprion { get; set; } } } }
The modified task screen would look like
And this is just the beginning we can do a lot more stuff as all the controls can be customized, I will post about grouping and also customizing display and edit controls in a subsequent blog.
Play with Clay
I have been a big fan of ExpandoObject ever since it was introduced with .net 4.0, and I have been using the Expando Object object ever since, but I always felt that it was not enough, ExpandoObject was fun and all but it was just not enough, and me being really lazy remember coying and pasting code just to loop through properties of a class using reflection and all that headache.
Enter Clay : The moment I have laid my eyes on this beautiful piece of code, I have become a huge fan, and it has all the things the expando should have been.
So How do you begin , Its really simple and also follows unique naming convention you begin with a clay object with New (emphasis on uppercase ‘N’)
dynamic New = new ClayFactory(); var cUser = New.User();
and thats it,
In Clay Indexer Syntax and Property Accessors are the same so
cUser.Name = cUser["Name"];
you can pass anonymous objects and also accepts named arguments, you can also use jQuery style chain able setters or put use them as an array
var cUser = New.User(new { Name = "Naresh", Mail = "something@mail.com" }); var cUser = New.User( Name : "Naresh", Mail : "something@mail.com"); var cUser = New.User().Name("Naresh").Mail("something@mail.com"); var Users = New.Array( New.User().Name("Naresh").Mail("something@mail.com"), New.User().Name("Rakesh").Mail("something@mail.com") );
So What are you waiting for get started at
clay.codeplex.com
Silverlight RIA: Validate Entity Server Side
If you are working with Validating a Entity , Simple Meta Data Validation is not always enough , you might have to do a server side validation, and it is really simple
Along with regular metadata add a Custom Validation Attribute which has type of class where your validation logic resides and String name of the Validation Function
[Required(ErrorMessage="Client Name is Required")] [StringLength(256)] [DisplayName("Client Name")] [CustomValidation(typeof(ClientValidations), "ValidateClientName")] public string ClientName { get; set; }
and a sample function for validation would be
public static ValidationResult ValidateClientName(string ClientName, ValidationContext context) { Models.DB.Client client = (Models.DB.Client)context.ObjectInstance; Web.Models.DB.PortalDataContext pc =new Models.DB.PortalDataContext(); var existing = pc.Clients.Where(c => c.ClientName == ClientName && c.Id != client.Id && c.Status == true); if (existing.Count() > 0) { return new ValidationResult("Invalid Client Name as the Client Name already Exists", new string[] { "ClientName" }); } return ValidationResult.Success; }






