본문 바로가기
C#/DevExpress

DevExpress / Winform GridView에서 마우스 우클릭 시 달력을 출력하기.

by HyunS_ 2019. 4. 16.
728x90

GridView에서 마우스 우클릭 했을 때 달력이 출력되도록 할 수 있습니다.

 

출력된 달력에서 날짜 변경 시 그 행의 날짜 입력 값이 변경됩니다.

 

public partial class Form1 : Form
    {   
        public Form1()
        {
            InitializeComponent();

            this.gridView1.MouseDown += GridView1_MouseDown;

            this.gridControl1.DataSource = CreateTable(5);
        }

        #region GridView1_MouseDown(sender, e)
        /// <summary>
        /// 마우스 클릭 했을 때 동작합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void GridView1_MouseDown(object sender, MouseEventArgs e)
        {
            GridHitInfo hitInfo = gridView1.CalcHitInfo(e.Location);

            ClearForm();

            if(e.Button == MouseButtons.Right && (hitInfo.HitTest == GridHitTest.RowCell || hitInfo.HitTest == GridHitTest.Row))
            { 
                DateEdit dateEdit = new DateEdit();

                dateEdit.EditValue = this.gridView1.GetRowCellValue(hitInfo.RowHandle, gridView1.Columns["Date"]);
                dateEditForm = new VistaPopupDateEditForm(dateEdit);
                dateEditForm.Calendar.EditDateModified += new EventHandler(OnEditDateModified);

                dateEditForm.ClosePopup();

                dateEditForm.Tag = hitInfo.RowHandle;

                dateEditForm.Location = PointToScreen(e.Location);

                dateEditForm.Size = dateEditForm.CalcFormSize();

                dateEditForm.ShowPopupForm();
            }
        }

        #endregion

        #region CreateTable(rowCount)

        /// <summary>
        /// 테이블을 생성합니다.
        /// </summary>
        /// <param name="rowCount">행 개수 입니다.</param>
        /// <returns>테이블 입니다.</returns>
        private DataTable CreateTable(int rowCount)
        {
            DataTable table = new DataTable();

            table.Columns.Add("Name"  , typeof(string));
            table.Columns.Add("ID"    , typeof(int));
            table.Columns.Add("Number", typeof(int));
            table.Columns.Add("Date"  , typeof(DateTime));

            for (int i = 0; i < rowCount; i++)
            {
                table.Rows.Add(new object[]
                {
                    string.Format("Name{0}", i), i, 3-i, DateTime.Now.AddDays(i)
                });
            }

            return table;
        }

        #endregion

        VistaPopupDateEditForm dateEditForm;

        #region ClearForm()

        /// <summary>
        /// 데이터를 초기화 합니다.
        /// </summary>
        private void ClearForm()
        { 
            if(dateEditForm != null)
            {
                dateEditForm.Calendar.EditDateModified -= new EventHandler(OnEditDateModified);
                dateEditForm.ClosePopup();
                dateEditForm.Dispose();
            }
        }

        #endregion

        #region OnEditDateModified(sender, e)

        /// <summary>
        /// 날짜를 갱신합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void OnEditDateModified(object sender, EventArgs e)
        {
            int rowHandle = Convert.ToInt32(dateEditForm.Tag);
            gridView1.SetRowCellValue(rowHandle, gridView1.Columns["Date"], dateEditForm.Calendar.DateTime);
            dateEditForm.HidePopupForm();
        }


        #endregion

    }

 

 

728x90

댓글