Welcome to my blog!

Treeview + Checkboxes

March 31, 2022 00:13

Treeview + Checkboxes (edit)


Winforms - Search in for items in CheckedListBox C# - Stack Overflow

Checkbox - WinForms TreeView with both radios and checkboxes - Stack Overflow

RadioListBox: A ListBox with Radio Buttons (Winforms version) - CodeProject

The Best C# Programmer In The World - Benjamin Perkins

Windows Forms Application

Select Text in TextBox Control - Windows Forms .NET Framework | Microsoft Docs

private void MainForm_Load(object sender, EventArgs e)
//Hide or Remove or Disable both Maximize, Minimize button
this.ControlBox = false;
this.MaximizeBox = false;
this.MinimizeBox = false;

//Disable Resizing WinForms
this.FormBorderStyle = FormBorderStyle.FixedSingle;

//Set KeyPreview = true => Using FormClosingEventArgs (MainForm_FormClosing)
this.KeyPreview = true;

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
if (keyData == Keys.Escape)
return true;
return base.ProcessCmdKey(ref msg, keyData);

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
if (MessageBox.Show("Are you sure you want to close this program?", "Application", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
e.Cancel = true;

How To Create Login Form In Windows Application Using C# (c-sharpcorner.com)

Going to Next Control by Clicking Enter or Down Key in C# Windows Forms Application (c-sharpcorner.com)

Source Code

benperk/TheBestCSharpProgrammerInTheWorld: The Best C# Programmer In The World - Benjamin Perkins (github.com)

Source Code | The Best C# Programmer In The World - Benjamin Perkins (thebestcsharpprogrammerintheworld.com)

Treeview with checkbox in WPF | The Best C# Programmer In The World - Benjamin Perkins (thebestcsharpprogrammerintheworld.com)

.NET FOLLOWER » Hide a TreeNode’s checkbox in a TreeView (dotnetfollower.com)

.NET FOLLOWER » WinForms: How to hide checkbox of the certain TreeNode in TreeView control (dotnetfollower.com)

WinForm Code Snippets

June 2, 2020 14:20

WinForm Code Snippets (edit)

T-SQL code snippets for SSMS


Useful SQL Server scripts/SPs for DBA or SQL Developers that I use and/or have created http://tsql.tech


SQL Code Snippets


Contains useful T-SQL snippets


Handy SQL Server Code Snippets




ASP.NET Core Identity Demos


Asp.NET Core SPA with React.js - for Augen test


App Screenshot

WinForm Code Snippets

How to set header text of a column in the DataGridView (C#)

grid.Columns[0].HeaderText = "First Column";


POCO Generator: POCO generating application for SQL Server


A data-bound multi-column combobox: An ownerdrawn multi-column combobox class with support for data-binding


How to Create a Custom ComboBox from Scratch


WinForms + RestSharp + ASP.NET Web API 2

February 22, 2020 15:30

ASP.NET Web API 2, RestSharp and Model Error Messages

CallerRepository class

static void Main(string[] args)
    EmployeeInfo model = new EmployeeInfo();
    CallerRepository caller = new CallerRepository();
        var response = caller.Get();
        foreach (var res in response)
            Console.WriteLine($"{res.Id} {res.EmpNo} {res.EmpName} {res.Salary} {res.DeptName} {res.Designation}");
    catch (Exception ex)
        Console.WriteLine($"Error Occured " +


Lost focus after showing MessageBox

February 5, 2020 10:39

MessageBoxOptions (edit)

Remove the MessageBoxOptions.DefaultDesktopOnly parameter and it will work correctly.

DefaultDesktopOnly specifies that "The message box is displayed on the active desktop" which causes the focus loss.


Given an instance of your Form, you can call a MessageBox like this:
MessageBox.show(form, "Message", "Title"); (Check the doc for other parameters.)

However if you want to call this from a background thread (e.g.: BackgroundWorker) you have to use Form.Invoke() like this:

   MessageBox.show(form, "Message", "Title");


MessageBox.Show(this, "Message", "Caption", MessageBoxButtons.OK);


I got the message box to show on top of all other applications by calling it like so:

                        "Server registered successfully!", 
                        "Gyptech Micrometer OPC Server",

The vital part being that last parameter, MessageBoxOptions.DefaultDesktopOnly. Now the box shows over top of the installer : )


MessageBox.Show(index.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);


MessageBox.Show(new Form() { WindowState = FormWindowState.Maximized, TopMost = true }, "You clicked Cancel button", "Cancel");







Show the Wait Cursor




You can use Cursor.Current.

// Set cursor as hourglass
Cursor.Current = Cursors.WaitCursor;

// Execute your time-intensive hashing code here...

// Set cursor as default arrow
Cursor.Current = Cursors.Default;

However, if the hashing operation is really lengthy (MSDN defines this as more than 2-7 seconds), you should probably use a visual feedback indicator other than the cursor to notify the user of the progress. For a more in-depth set of guidelines, see this article.

As @Am pointed out, you may need to call Application.DoEvents(); after Cursor.Current = Cursors.WaitCursor; to ensure that the hourglass is actually displayed.

Format Textbox While Input

March 14, 2018 10:33

Windows Forms Application Documents (edit)



Cấu hình nâng cao về ngày tháng năm, số trong Windows




How to format a windows forms Textbox with thousand separator and decimal separtor for Numeric input

Set up dot instead of comma in numeric values

Extended Textbox

Textbox display formatting

        private void textBox1_KeyUp(object sender, KeyEventArgs e)
            if ((e.KeyCode == Keys.Right)
                || (e.KeyCode == Keys.Left)
                || (e.KeyCode == Keys.Up)
                || (e.KeyCode == Keys.Down))
                // Do nothing
                if (!string.IsNullOrEmpty(textBox1.Text))
                    System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("vi-VN");
                    var valueBefore = decimal.Parse(textBox1.Text.Replace(".", ""), System.Globalization.NumberStyles.AllowThousands);
                    textBox1.Text = String.Format(culture, "{0:N0}", valueBefore);
                    textBox1.Select(textBox1.Text.Length, 0);


November 6, 2017 06:58

Custom controls

Divider Panel - A tutorial on creating a custom Windows Forms control from Start to Toolbox


Create Custom/Professional UI in WinForms app


Free Desktop Icons







How to make window forms look more beautiful

If you're trying to theme the built-in controls with the Windows Aero user interface, you can find several drop-in control libraries online.

Most of those libraries include support for the Desktop Window Manager functions, including adding the Aero Glass effect to your application. Daniel Moth explains this in greater detail in a series of articles on his blog:

Of course, you can quickly get in over your head. In particular, the standard controls do not render correctly over glass because the color black is rendered as transparent. Anything that displays black
text will look washed out and be unreadable. The right way to draw text and images on the extended glass area is described here: Drawing smooth text and pictures on the extended glass area.

You'll also have to remember that these features are only available on Windows Vista and later versions. If your application needs to run under Windows XP (which it probably does), you're going to have to make sure that your application falls back gracefully and that you UI looks good there, too.

If you need more information on Aero Glass effects, search Stack Overflow. Myself and many others have posted lots of answers to related questions. For example, this one, and this one, and this one.

In general, however, my suggestion is to use the glass effect sparingly and only when you really feel that it adds something to your application. Don't just throw in gratuitous eye candy because you can. The most important thing is to focus on the usability of your application, from the perspective of its typical user. There is no reason to add additional complexity that doesn't provide any real usability benefits.

Make C# Applications look nice

Go and learn Windows Presentation Foundation. It utilizes DirectX and provides developers with a compact model for building rich user experiences for Windows-based systems. You can start on this tutorial site to learn about what WPF is and what you can do with that framework.

Also check out these components to see the power of WPF:

How can you make a .net windows forms project look fresh?


I'm working on a visual studio 2005 vb.net windows forms project that's been around for several years. It's full of default textboxes, labels, dropdowns, datagrids, datetime pickers -- all the standard stuff. The end result is a very gray, old-looking project.

What would be the best approach to making this project look fresh and snazzy? I'd rather not rewrite the entire solution with all brand new forms objects, but would that be avoidable?

I was actually just sprucing up a dialog today. A lot of it depends on what kind of application you have, and what OS it is running on. A couple of these tips will certainly go a long way to jazzing things up.

  1. Ensure adequate spacing between controls — don't cram them all together. Space is appealing. You might also trying flowing the controls a little differently when you have more space.

  2. Put in some new 3D and glossy images. You can put a big yellow exclamation mark on a custom warning dialog. Replace old toolbar buttons with new ones. Two libraries I have used and like are GlyFX and IconExperience. You can find free ones too. Ideally get a graphic artist to make some custom ones for the specific actions your application does to fill in between the common ones you use (make sure they all go together). That will go a long way to making it look fancy.

  3. Try a different font. Tahoma is a good one. Often times the default font is MS Sans Serif. You can do better. Avoid Times New Roman and Comic Sans though. Also avoid large blocks of bold — use it sparingly. Generally you want all your fonts the same, and only use different fonts sparingly to set certain bits of text apart.

  4. Add subdued colors to certain controls. This is a tricky one. You always want to use subdued colors, nothing bright or stark usually, but the colors should indicate something, or if you have a grid you can use it to show logical grouping. This is a slippery slope. Be aware that users might change their system colors, which will change how your colors look. Ideally give them a few color themes, or the ability to change colors.

  5. Instead of thinking eye-candy, think usability. Make the most common course of action obvious. Mark Miller of DevExpress has a great talk on the Science of User Interface Design. I actually have a video of it and might be able to post it online with a little clean-up.

  6. Invest in a few good quality 3rd party controls. Replacing all your controls could be a pain, but if you are using the default grids for example, you would really jazz it up with a good grid from DevExpress or some other component vendor. Be aware that different vendors have different philosophies for how their components are used, so swapping them out can be a bit of a pain. Start small to test the waters, and then try something really complicated before you commit to replacing all of them. The only thing worse then ugly grids is ugly grids mixed with pretty grids. Consistency is golden!

  7. You also might look at replacing your old tool bars and menus with a Ribbon Control like Microsoft did in Office 2007. Then everyone will think you are really uptown! Again only replacing key components and UI elements without thinking you need to revamp the whole UI.

  8. Of course pay attention to the basics like tab order, etc. Consistency, consistency, consistency.

Some apps lend themselves to full blown skinning, while others don't. Generally you don't want anything flashy that gets used a lot.


Windows Forms Application

October 28, 2017 17:19

Creating Custom Windows Forms in C# using Panels
Pritam Zope, 5 Mar 2017
In this article we will customize basic windows forms using only Panels in diffrerent colors in Visual Studio using C#



Custom Rendering for the ToolStrip, MenuStrip, and StatusStrip controls

bcryner, 20 Sep 2008
Custom rendering for the ToolStrip, MenuStrip, and StatusStrip controls




Custom VisualStudio 2008-style MenuStrip and ToolStrip Renderer in C#
Brian C Hart, 2 Apr 2010
An adaptation of Nick Thissen's article on VBForums translated to C# and bottled up into a Class Library you can just drop into your projects.



MenuStrip in C#



Office ToolStrip 

Phil. Wright, 6 Dec 2006




MBToolStrip/MBStatusStrip is a ToolStrip/StatusStrip which inherits all the properties of simple ToolStrip and StatusStrip control

Manoj K Bhoir, 9 Mar 2012



October 27, 2017 06:14

Windows Forms Application (edit)

  • Windows Forms Application (WinForms)
  • Universal Windows Platform (UWP)
  • Fluent Design System

Microsoft giving developers access to Fluent Design for Win32 apps and more

Custom Dialogs in WinForms:


Transparent Labels in WinForms:


Unifying Web and Windows Form design and layout:



WinForms: Cần nắm vứng các khái niệm về Control, Component, Delegate, Event



  • XtraTile Control

Custom controls:

  • XtraTile Control












WinForm Sample




Create Dynamic Menu In Windows Form C#
Dynamic Menu and Windows Form C#
















Chia sẻ một vài kinh nghiệm lập trình WinForm

Trong quá trình làm việc với vị trí như một người phát triển sản phẩm, tôi có một số kinh nghiệm muốn chia sẽ cho những người mới làm quen như sau. Xin giới thiệu mình cũng khá rành về SQL Server, từ trước đến nay từng lập trình trên Fox và C#, kinh nghiệm triển khai phần mềm kế toán và SAP Business One từ năm 2006 đến nay, hiện vẫn viết Winform App bằng C# và SQL cho một công ty phần mềm tại TPHCM.

Với các control, hồi mới làm quen với C#, mình mê mẩn với bộ công cụ DevExpress, phải công nhận là công cụ của nó cực đẹp và dễ dùng. Sau này có kinh nghiệm hơn một chút, và đi làm thực tế, khách hàng và kể cả công ty mình khá tôn trọng bản quyền phần mềm (khá thôi nhé), do đó dần dần mình hình thành một quan điểm là hạn chế tối đa xài đồ chùa, đồ crack hết mức có thể. Từ đó mình nhận ra rằng DevExpress thì đẹp thật, nhưng tiền mua thì không có, mà crack thì lại phạm vào tinh thần tôn trọng bản quyền, từ đó mình tìm cách từ bỏ các bộ công cụ của bên thứ 3, phần vì mặc dù đẹp và dễ dùng nhưng về cơ bản là có nhiều thứ mình không cần xài đến, lại làm nặng chương trình, và đặc biệt là phải mua hoặc crack, về lâu về dài, khi người dùng Việt Nam bắt đầu có ý thức tôn trọng bản quyền cao hơn thì những thứ đó cần phải tính đến.

Tuy nhiên, bộ control có sẵn của .Net dù khá đầy đủ nhưng vẫn còn nhiều hạn chế, ở đây mình chia sẻ hai hạn chế cơ bản của hai control sau:

1) TreeView:

Theo quan điểm cá nhân của mình thì cái TreeView này có vẻ như Microsoft không đầu tư để viết cho nó đàng hoàng, trên bản .Net 3.5 mình muốn mỗi node có một icon là coi như bó tay (hoặc có thể mình chưa biết làm), các bản sau thì không biết thế nào. Và đặc biệt, nếu datasource của mình có nhiều hơn hai thuộc tính (hai cột trở lên đối với DataTable) thì cũng bó tay nốt, trong khi đó với TreeView của DevExpress thì vô cùng đơn giản, gán dataSoure, ParentColumn, Childrend column là xong, lại có cả Binding nữa.
Nhưng xài của DevExpress thì lại vi phạm vào những thứ như mình nói ở trên, với lại cả bộ DevExpress đồ sộ như vậy chẳng lẽ lại chỉ xài có mỗi một control TreeView, mà có muốn xài một TreeView đi nữa thì cũng phải add 3,4 file đi kèm rất nặng. Cho nên mình đã thay thế nó bằng TreeAdvance hoàn toàn miễn phí trên codeproject.com, các bạn search từ khóa này sẽ ra, chịu khó nghiên cứu cách sử dụng một ít nữa thì xài rất thoải mái, lại gọn nhẹ, có cả source cho các bạn nghiên cứu nến chịu khó. Chi tiết tham khảo tại: http://www.codeproject.com/Articles/14741/Advanced-TreeView-for-NET

Hình minh họa cho project mình đang làm:


2) DataGridView

Control này thì quá đủ cho chúng ta xài, tuy nhiên khi datasource có dữ liệu lớn, khoảng 10.000 đến 100.000 dòng trở lên thì control này build lại rất chậm, nhưng khi thay thế nó bằng ObjectListView  thì nó build gần như là ngay lập tức, do đó, để view khối lượng dữ liệu lớn, bạn có thể sử dụng ObjectListView thay thế cho DataGridView. Theo mình đây là một trong những control miễn phí tuyệt vời nhất. Chi tiết mời bạn tham khảo tại: http://www.codeproject.com/Articles/16009/A-Much-Easier-to-Use-ListView

Một vấn đề nữa với DataGridView là có nhiều khi bạn muốn chọn giá trị từ một danh sách có sẵn, danh sách thì tùy, có loại danh sách đơn giản, nhỏ, thì có thể sử dụng column kiểu ComboBox là đủ, nhưng với danh sách dạng lớn thì làm thế nào, bạn muốn có một button bên trong Cell để chọn như DevExpress có thể làm? Điều này thì DataGridView không có, khi này bạn có thể thay đổi suy nghĩ một chút, không được vậy thì thêm vào một column bên cạnh, kiểu là button, với thuộc tính Width nhỏ thôi, vậy là người dùng chỉ cần click vào đó là có thể chọn danh sách được rồi, nó không đẹp bằng DevExpress nhưng cũng không tệ chút nào, thậm chí là khá đẹp. Như ví dụ sau

3) Report:

Có một số bạn có quan điểm rất sai lầm là coi nhẹ việc viết và thiết kế báo cáo, nhưng theo mình, đó là việc quan trọng, nếu không muốn nói là gần như quan trọng nhất, bạn nhập liệu và lưu trữ, nhưng nếu không trình bày được dữ liệu đó ra theo những định dạng như nhà quản lý yêu cầu thì phần mềm của bạn chỉ mới đạt được 2/3 chương trình đó là thu thập và lưu trữ dữ liệu, chứ chưa thể đóng vai trò phân tích dữ liệu được. Do đó, một phần mềm được coi là mạnh không chỉ tiện dụng ở việc thu lập và lưu trữ, mà còn phải xuất dữ liêu đó ra theo các báo cáo với các tiêu chí và mục đích khác nhau của nhà quản lý. Do đó, việc lựa chọn công cụ để thiết kế báo cáo cũng cực kỳ quan trọng không kém.

Theo mình thấy, trong .Net hiện nay có hai control cho thiết kế report là Crystal Report và Report Control. Ý kiến của mình là nên sử dụng Report Control của Microsoft hơn. Report Control theo mình được biết thì ra đời sau Crystal Report, và Crystal Report cũng đã không còn là của Microsoft nữa mà được bán lại cho SAP từ lâu, Microsoft tập trung phát triển Reporting Service để thay thế cho Crystal Report, và Report Control là phiên bản rút gọn của Reporting Service. Bản này dễ sử dụng hơn rất nhiều. Mình từng thiết kế report trên Fox, Access, Active Report, Crystal Report, nhưng mình chưa thấy cái nào có thể làm tốt như Report Control trên .net cả. Với hệ thống phần mềm lớn với số lượng hàng trăm, hàng nghìn báo cáo thì control này sẽ tiết kiệm được lượng lớn thời gian cho các bạn làm được nhiều việc khác.

Bên cạnh đó, do các ứng dụng lớn có rất nhiều báo cáo, nếu bạn đang không dùng Reporting Service của MS thì bạn cũng nên tạo một cơ chế để tạo được tham số động để chạy các store lấy dữ liệu, vì thông thường các báo cáo cũng rất thường xuyên thay đổi, thêm bớt tham số… Điều này sẽ tiết kiệm được rất nhiều thời gian và giảm thiểu sự nhàm chán.

4) Connection

Việc kết nối từ Client đến SQL Server có thể theo cơ chế xác thực của Window hoặc của SQL, của Window thì bảo mật hơn, nhưng đồng nghĩa với việc khi triển khai bạn sẽ gặp khó khăn hơn do các máy phải đảm bảo kết nối thông suốt được với nhau trong mạng nội bộ hoặc thông qua VPN. Window xác thực cũng tránh cho việc những máy tính không nằm trong mạng của bạn không thể động chạm đến dữ liệu. Trường hợp không có VPN hoặc khó khăn trong việc triển khai cơ chế này, bắt buộc bạn phải NATing router, mở port SQL 1433 thì có thể tham khảo ở đây. Nếu bạn không muốn NAT và mở port SQL, tốt hơn là sử dụng một WCF service được host trên IIS và mọi hoạt động ở Client đều được kết nối thông qua Service này….

5) Menu

Với chương trình lớn, việc thay đổi, cập nhật menu diễn ra thường xuyên. Để làm nhanh hơn, bạn nên tạo ra một cơ chế có thể tạo menu động, toàn bộ thông tin của Menu sẽ được lưu trữ dưới database, mỗi lần thêm, bớt, sửa đổi bạn chỉ cần cập nhật nó thông qua giao diện là được, kinh nghiệm của tôi là làm điều này sẽ tiết kiệm rất nhiều thời gian.


Recent posts