첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170
using System.Drawing;
using System.Windows.Forms;

using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Menu;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;

...

private GridControl gridControl;
private GridView gridView;

...

this.gridControl.MouseDown += gridControl_MouseDown;

...

this.gridView.CustomDrawRowIndicator += gridView_CustomDrawRowIndicator;

...

#region 그리드 컨트롤 마우스 DOWN 처리하기 - gridControl_MouseDown(sender, e)

/// <summary>
/// 그리드 컨트롤 마우스 DOWN 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void gridControl_MouseDown(object sender, MouseEventArgs e)
{
    if(e.Button == MouseButtons.Right)
    {
        ShowMenu(this.gridView, e.X, e.Y);
    }
}

#endregion

#region 그리드 뷰 행 지시자 커스텀 그리기 - gridView_CustomDrawRowIndicator(sender, e)

/// <summary>
/// 그리드 뷰 행 지시자 커스텀 그리기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void gridView_CustomDrawRowIndicator(object sender, RowIndicatorCustomDrawEventArgs e)
{
    if(e.RowHandle == GridControl.InvalidRowHandle)
    {
        e.Handled = true;

        e.Painter.DrawObject(e.Info);

        Rectangle rectangle = e.Bounds;

        e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(100, 255, 0, 0)), rectangle);

        rectangle.Height--;
        rectangle.Width--;

        e.Graphics.DrawRectangle(Pens.Red, rectangle);
    }
}

#endregion

#region 메뉴 보여주기 - ShowMenu(gridView, x, y)

/// <summary>
/// 메뉴 보여주기
/// </summary>
/// <param name="gridView">그리드 뷰</param>
/// <param name="x">X 좌표</param>
/// <param name="y">Y 좌표</param>
public void ShowMenu(GridView gridView, int x, int y)
{
    GridHitInfo gridHitInfo = gridView.CalcHitInfo(new Point(x, y));

    GridViewMenu gridViewMenu = null;

    if(gridHitInfo.HitTest == GridHitTest.ColumnButton)
    {
        gridViewMenu = new TestGridViewMenu(this.gridView);

        gridViewMenu.Init(gridHitInfo);

        gridViewMenu.Show(gridHitInfo.HitPoint);
    }
}

#endregion

 

▶ TestGridViewMenu.cs

using System;

using DevExpress.Utils.Menu;
using DevExpress.XtraGrid.Menu;
using DevExpress.XtraGrid.Columns;
using DevExpress.XtraGrid.Views.Grid;

/// <summary>
/// 테스트 그리드 뷰 메뉴
/// </summary>
public class TestGridViewMenu : GridViewMenu
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 생성자 - TestGridViewMenu(gridView)

    /// <summary>
    /// 생성자
    /// </summary>
    /// <param name="gridView">그리드 뷰</param>
    public TestGridViewMenu(GridView gridView) : base(gridView)
    {
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Protected

    #region 항목들 생성하기 - CreateItems()

    /// <summary>
    /// 항목들 생성하기
    /// </summary>
    protected override void CreateItems()
    {
        Items.Clear();

        DXSubMenuItem menuItem = new DXSubMenuItem("컬럼들");

        Items.Add(menuItem);

        Items.Add(CreateMenuItem("런타임 컬럼 커스텀 설정", GridMenuImages.Column.Images[3], "커스텀 설정", true));

        foreach(GridColumn gridColumn in View.Columns)
        {
            if(gridColumn.OptionsColumn.ShowInCustomizationForm)
            {
                menuItem.Items.Add
                (
                    CreateMenuCheckItem
                    (
                        gridColumn.GetTextCaption(),
                        gridColumn.VisibleIndex >= 0,
                        null,
                        gridColumn,
                        true
                    )
                );
            }
        }
    }

    #endregion

    #region 메뉴 항목 클릭시 처리하기 - OnMenuItemClick(sender, e)

    /// <summary>
    /// 메뉴 항목 클릭시 처리하기
    /// </summary>
    /// <param name="sender">이벤트 발생자</param>
    /// <param name="e">이벤트 인자</param>
    protected override void OnMenuItemClick(object sender, EventArgs e)
    {
        if(RaiseClickEvent(sender, null))
        {
                return;
        }

        DXMenuItem menuItem = sender as DXMenuItem;

        if(menuItem.Tag == null)
        {
            return;
        }

        if(menuItem.Tag is GridColumn)
        {
            GridColumn gridColumn = menuItem.Tag as GridColumn;

            gridColumn.VisibleIndex = gridColumn.VisibleIndex >= 0 ? -1 : View.VisibleColumns.Count;
        }
        else if(menuItem.Tag.ToString() == "커스텀 설정")
        {
            View.ColumnsCustomization(); 
        }
    }

    #endregion
}

 

728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요