■ FilterControl 클래스 : PopupMenuShowing 이벤트를 사용해 커스텀 컨텍스트 메뉴 표시하기

------------------------------------------------------------------------------------------------------------------------


TestProject.zip


MainForm.cs

 

 

using System;

using System.Data;

 

using DevExpress.Data.Filtering.Helpers;

using DevExpress.Utils.Menu;

using DevExpress.XtraEditors;

using DevExpress.XtraEditors.Controls;

using DevExpress.XtraEditors.Filtering;

using DevExpress.XtraGrid.Views.Base;

 

namespace TestProject

{

    /// <summary>

    /// 메인 폼

    /// </summary>

    public partial class MainForm : XtraForm

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainForm()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainForm()

        {

            InitializeComponent();

 

            Load                              += Form_Load;

            this.gridView.FilterEditorCreated += gridView_FilterEditorCreated;

        }

 

        #endregion

 

        #region 폼 로드시 처리하기 - Form_Load(sender, e)

 

        /// <summary>

        /// 폼 로드시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void Form_Load(object sender, EventArgs e)

        {

            DataTable dataTable = new DataTable();

 

            dataTable.Columns.Add("ID"   , typeof(int   ));

            dataTable.Columns.Add("Name" , typeof(string));

            dataTable.Columns.Add("Check", typeof(bool  ));

 

            for(int i = 1; i < 10; i++)

            {

                dataTable.Rows.Add(i, string.Format("Item {0}", i), i % 2 == 0);

            }

 

            this.gridControl.DataSource = dataTable;

 

            this.gridView.ActiveFilterString = "[Check] = false";

        }

 

        #endregion

        #region 그리드 뷰 필터 에디터 생성시 처리하기 - gridView_FilterEditorCreated(sender, e)

 

        /// <summary>

        /// 그리드 뷰 필터 에디터 생성시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void gridView_FilterEditorCreated(object sender, FilterControlEventArgs e)

        {

            e.FilterControl.PopupMenuShowing += FilterControl_PopupMenuShowing;

        }

 

        #endregion

        #region 필터 컨트롤 팝업 메뉴 표시시 처리하기 - FilterControl_PopupMenuShowing(sender, e)

 

        /// <summary>

        /// 필터 컨트롤 팝업 메뉴 표시시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void FilterControl_PopupMenuShowing(object sender, PopupMenuShowingEventArgs e)

        {

            if(e.MenuType == FilterControlMenuType.Group)

            {

                e.Menu.Remove(GroupType.NotAnd);

                e.Menu.Remove(GroupType.NotOr);

 

                e.Menu.Find(StringId.FilterMenuGroupAdd).Enabled = false;

                e.Menu.Find(StringId.FilterMenuClearAll).Caption = "Remove All";

            }

 

            if(e.MenuType == FilterControlMenuType.Clause)

            {

                ClauseNode node = e.CurrentNode as ClauseNode;

 

                if(node.Property.Name == "ID")

                {

                    DXMenuItem equalItem        = e.Menu.Find(ClauseType.Equals);

                    DXMenuItem doesNotEqualItem = e.Menu.Find(ClauseType.DoesNotEqual);

 

                    for(int i = e.Menu.Items.Count - 1; i >= 0; i--)

                    {

                        DXMenuItem item = e.Menu.Items[i];

 

                        if(!item.Equals(equalItem) && !item.Equals(doesNotEqualItem))

                        {

                            item.Visible = false;

                        }

                    }

                }

            }

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------