[DEVEXPRESS/WINFORM] GridView 클래스 : CustomDrawEmptyForeground 이벤트를 사용해 데이터가 없을 때 텍스트 표시하기
DevExpress/WinForm 2020. 4. 26. 15:07728x90
반응형
728x170
▶ MainForm.cs
using System.Drawing;
using System.Windows.Forms;
using DevExpress.Data.Filtering;
using DevExpress.LookAndFeel;
using DevExpress.Skins;
using DevExpress.Utils;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Views.Grid;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : XtraForm
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 링크 브러시
/// </summary>
private SolidBrush linkBrush = new SolidBrush(EditorsSkins.GetSkin(UserLookAndFeel.Default.ActiveLookAndFeel).Colors["HyperLinkTextColor"]);
/// <summary>
/// 매칭 미발견 텍스트 폰트
/// </summary>
private Font noMatchFoundTextFont = new Font("Tahoma", 10);
/// <summary>
/// 매칭 미발견 텍스트
/// </summary>
private string noMatchFoundText = "No matches found";
/// <summary>
/// 매칭 미발견 사각형
/// </summary>
private Rectangle noMatchFoundRectangle = Rectangle.Empty;
/// <summary>
/// 다시 조회 시도 텍스트 폰트
/// </summary>
private Font trySearchingAgainTextFont = new Font("Tahoma", 15, FontStyle.Underline);
/// <summary>
/// 다시 조회 시도 텍스트 볼드체 폰트
/// </summary>
private Font trySearchingAgainTextBoldFont = new Font("Tahoma", 15, FontStyle.Underline | FontStyle.Bold);
/// <summary>
/// 다시 조회 시도 텍스트
/// </summary>
private string trySearchingAgainText = "Try searching again";
/// <summary>
/// 다시 조회 시도 사각형
/// </summary>
private Rectangle trySearchingAgainRectangle = Rectangle.Empty;
/// <summary>
/// 다시 조회 시도 사각형 커서 포함 여부
/// </summary>
private bool trySearchingAgainRectangleContainCursor = false;
/// <summary>
/// 오프셋
/// </summary>
private int offset = 10;
/// <summary>
/// 조회명
/// </summary>
private string searchName = string.Empty;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
this.gridView.InitializeView
(
true, // Multi Select
GridMultiSelectMode.RowSelect, // Grid Multi Select Mode
DrawFocusRectStyle.CellFocus, // Draw Focus Rect Style
true, // Show Indicator
true, // Show Column Headers
true, // Allow Column Moving
true, // Allow Column Resizing
true, // Allow Filter
true, // Allow Sort
false, // Allow Cell Merge
EditorShowMode.Default, // Editor Show Mode
false // Editable
);
this.gridView.OptionsBehavior.AutoPopulateColumns = true;
this.gridControl.DataSource = new nwindDataSetTableAdapters.EmployeesTableAdapter().GetData();
this.gridView.ActiveFilterCriteria = new BinaryOperator("City", searchName);
this.gridView.CustomDrawEmptyForeground += gridView_CustomDrawEmptyForeground;
this.gridView.MouseMove += gridView_MouseMove;
this.gridView.MouseDown += gridView_MouseDown;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 그리드 뷰 빈 전경 커스텀 그리기 - gridView_CustomDrawEmptyForeground(sender, e)
/// <summary>
/// 그리드 뷰 빈 전경 커스텀 그리기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void gridView_CustomDrawEmptyForeground(object sender, CustomDrawEventArgs e)
{
e.DefaultDraw();
e.Appearance.Options.UseFont = true;
e.Appearance.Font = this.noMatchFoundTextFont;
Size size = e.Appearance.CalcTextSize(e.Cache, this.noMatchFoundText, e.Bounds.Width).ToSize();
int x = (e.Bounds.Width - size.Width) / 2;
int y = e.Bounds.Y + offset;
this.noMatchFoundRectangle = new Rectangle(new Point(x, y), size);
e.Appearance.DrawString(e.Cache, this.noMatchFoundText, this.noMatchFoundRectangle);
e.Appearance.Font = this.trySearchingAgainRectangleContainCursor ? this.trySearchingAgainTextBoldFont : this.trySearchingAgainTextFont;
size = e.Appearance.CalcTextSize(e.Cache, this.trySearchingAgainText, e.Bounds.Width).ToSize();
x = this.noMatchFoundRectangle.X - (size.Width - this.noMatchFoundRectangle.Width) / 2;
y = this.noMatchFoundRectangle.Bottom + offset;
size.Width += offset;
this.trySearchingAgainRectangle = new Rectangle(new Point(x, y), size);
e.Appearance.DrawString(e.Cache, this.trySearchingAgainText, this.trySearchingAgainRectangle, this.linkBrush);
}
#endregion
#region 그리드 뷰 마우스 이동시 처리하기 - gridView_MouseMove(sender, e)
/// <summary>
/// 그리드 뷰 마우스 이동시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void gridView_MouseMove(object sender, MouseEventArgs e)
{
GridView gridView = sender as GridView;
this.trySearchingAgainRectangleContainCursor = this.trySearchingAgainRectangle.Contains(e.Location);
gridView.GridControl.Cursor = this.trySearchingAgainRectangleContainCursor ? Cursors.Hand : Cursors.Default;
gridView.InvalidateRect(this.trySearchingAgainRectangle);
}
#endregion
#region 그리드 뷰 마우스 DOWN 처리하기 - gridView_MouseDown(sender, e)
/// <summary>
/// 그리드 뷰 마우스 DOWN 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void gridView_MouseDown(object sender, MouseEventArgs e)
{
GridView gridView = sender as GridView;
if(this.trySearchingAgainRectangleContainCursor)
{
this.searchName = XtraInputBox.Show
(
string.Format("Enter {0}", "Name"),
string.Format("Enter {0} dialog", "Name"),
this.searchName
);
gridView.ActiveFilterCriteria = new BinaryOperator("City", this.searchName);
}
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
댓글을 달아 주세요