아래처럼 처리하면 Copy 시 컬럼 해더까지 포함된다. 

* BandedGridView 인 경우 컬럼의 Caption 값이 복사된다.

gridView.OptionsClipboard.CopyColumnHeaders = DefaultBoolean.True;


수동으로 처리할 경우 아래처럼 하면 클립보드에 GridView 의 전체 내용을 복사할 수있다.

* CellMerge 를 혀용한 경우 반드시 false 로 바꾸고 해야 SelectAll() 명령이 제대로 처리가 된다.

gridView.OptionsClipboard.CopyColumnHeaders = DefaultBoolean.True;

gridView.OptionsSelection.MultiSelect = true;

gridView.OptionsView.AllowCellMerge = false;

gridView.SelectAll();


gridView.CopyToClipboard();


일반적으로 GridView 에서 키보드로 포커스이동이 아래 처럼 포커스가 행의 끝으로 가면

다음 행으로 넘어가게 되어있다.

이를 다음행으로 넘어가지 않고 그 행에 두고 싶다면 아래 코드를 추가해 주면된다.

this.gridView.OptionsNavigation.AutoMoveRowFocus = false;

아래 처럼 포커스 이동시 다음행으로 넘어가지 않는다.


XtraGrid 의 GridView 의 KeyDown 이벤트는 Cell 내부 값을 입력하는 경우에 이벤트가 발생되지 않는다.

Cell 내부의 KeyDown 이벤트를 주고싶은때는 

GridControl 의 EditorKeyDown 이벤트를 사용하면 된다.


아래코드를 보면 알수 있지만 Cell 값 편집모드에서 GridView 의 KeyDown 이벤트는 처리 되지 않는다.

        this.gridView.KeyDown += GridView_KeyDown;


        private void GridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.V && e.Control)
            {
                string clipBoard = Clipboard.GetText();

                if (!string.IsNullOrEmpty(clipBoard))
                {
                    MessageBox.Show(clipBoard);
                }
            }
        }

     

하지만 아래처런 GridControl 의 EditorKeyDown 이벤트로 처리하면 Cell 값 편집모드에서 KeyDown 이벤트가 처리된다.

        this.gridControl.EditorKeyDown += GridControl_EditorKeyDown;


        private void GridControl_EditorKeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.V && e.Control)
            {
                string clipBoard = Clipboard.GetText();

                if (!string.IsNullOrEmpty(clipBoard))
                {
                    MessageBox.Show(clipBoard);
                }
            }
        }


Grid 에 Data 가 정형화 되어있지 않은 경우 특정 셀의 컬럼에 길이 제한을 두고 싶을 때 사용하는 방법이다.

아래는 LOT 컬럼이 5자가 넘는 경우 처리하는 방법으로 아래처럼 표시가 된다.

using System.Collections.Generic;
using System.Windows.Forms;

using DevExpress.XtraGrid.Views.Grid.ViewInfo;

namespace WindowsFormsApp
{
    public partial class MainForm : Form

    {
        public MainForm()
        {
            InitializeComponent();

            this.gridView.ValidatingEditor += GridView_ValidatingEditor;

            TestData testData1 = new TestData();
            testData1.LOT = "L001";
            testData1.WAFER = "01";

            TestData testData2 = new TestData();
            testData2.LOT = "L001";
            testData2.WAFER = "02";

            List<TestData> testDatas = new List<TestData>();
            testDatas.Add(testData1);
            testDatas.Add(testData2);
            this.gridControl.DataSource = testDatas;
        }

        void GridView_ValidatingEditor(object sender, DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs e)
        {
            string value_string = e.Value.ToString();
            GridViewInfo viewInfo = gridView.GetViewInfo() as GridViewInfo;
            GridCellInfo cellInfo = viewInfo.GetGridCellInfo(gridView.FocusedRowHandle, gridView.FocusedColumn);

            if (cellInfo.Column.FieldName == "LOT")
            {
                if (value_string.Length > 5)
                {
                    e.ErrorText = "The value is too long";
                    e.Valid = false;
                }
            }
        }

        class TestData
        {
            public string LOT { get; set; }
            public string WAFER { get; set; }
        }
    }
}


GridView 의 BestFitColumns() 는 데이터 길이에 따라 컬럼 너비를 자동으로 조절해 준다.

하지만 데이터가 많은 경우 컬럼 길이 계산을 위해 시간을 많이 소비해서

실제 화면에 보여지는데 시간이 걸린다.

이때 아래처럼 BestFitMaxRowCount 값을 설정하게되면 

데이터 전체가 아닌 특정 Row 까지의 데이터만 가지고 처리를 하게되어

화면에 보여지는데 걸리는 시간을 줄일 수 있다.


this.gridControl.DataSource = testDatas;

this.gridView.OptionsView.BestFitMaxRowCount = 100;

this.gridView.BestFitColumns();


XtraGrid 에 데이터 바인딩을 하면 처음 Row 를 선택하고 있는데

이를 선택하지 않는 상태로 변경하기 위해서는


데이터 바인딩을 하고

this.gridContro.DataSource = testDatas;


아래처럼 GridView 의 FocusInvalidRow() 를 호출해 주면된다.

this.gridView.FocusInvalidRow();

GridView 에서 특정 Row 의 Cell 을 Merge 하고 싶은 경우가 있는데 

찾아보니 참고할 만한 소스가 있어 기억을 위해 링크를 남긴다


https://github.com/DevExpress-Examples/how-to-merge-cells-horizontally-in-gridview-via-the-customdrawcell-event-e4039


실행해 보았는데 셀의 내용이 머지가 되기는 한데 가운데 선이 보이게되서 완벽하진 않다.

아래 그림처럼 2번째 행에 내용이 하나로 보여지긴 한데 Cell 간 선이 나타난다;;


테스트한 소스

CS.zip


DevExpress 의 PanelControl 에서 스크롤 속성이 없다.

그래서 XtraScrollableControl 컨트롤을 사용하는데

여기에 다른 컨트롤을 갖다 놓으면 스크롤을 휠로 제어할수 없게된다ㅜㅠ

 

이를 위해선 아래 처럼 ScrollHelper 를 선언한후

XtraScrollableControl 컨트롤이 들어간 화면 초입에 아래처럼 코딩하면

문제없이 휠로도 스크롤이 가능해진다.

 

ScrollHelper scrollHelper = new ScrollHelper();

scrollHelper.EnableScrollOnMouseWheel();

 

또한 화면이 Dispose() 이벤트에서 아래처럼

기능을 꺼야한다.

scrollHelper.DisableScrollOnMouseWheel();

 

 

    public class ScrollHelper

    {

        XtraScrollableControl scrollableControl;

 

        public ScrollHelper(XtraScrollableControl scrollableControl)

        {

            this.scrollableControl = scrollableControl;

        }

 

        public void EnableScrollOnMouseWheel()

        {

            scrollableControl.VisibleChanged += OnVisibleChanged;

        }

 

        void OnVisibleChanged(object sender, EventArgs e)

        {

            scrollableControl.Select();

            UnsubscribeFromMouseWheel(scrollableControl.Controls);

            SubscribeToMouseWheel(scrollableControl.Controls);

        }

 

        private void SubscribeToMouseWheel(Control.ControlCollection controls)

        {

            foreach (Control ctrl in controls)

            {

                ctrl.MouseWheel += OnMouseWheel;

                SubscribeToMouseWheel(ctrl.Controls);

            }

        }

 

        private void UnsubscribeFromMouseWheel(Control.ControlCollection controls)

        {

            foreach (Control ctrl in controls)

            {

                ctrl.MouseWheel -= OnMouseWheel;

                UnsubscribeFromMouseWheel(ctrl.Controls);

            }

        }

 

        void OnMouseWheel(object sender, MouseEventArgs e)

        {

            DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;

            int scrollValue = scrollableControl.VerticalScroll.Value;

            int largeChange = scrollableControl.VerticalScroll.LargeChange;

            if (e.Delta < 0)

                scrollableControl.VerticalScroll.Value += scrollableControl.VerticalScroll.LargeChange;

            else

                if (scrollValue < largeChange)

                scrollableControl.VerticalScroll.Value = 0;

            else

                scrollableControl.VerticalScroll.Value -= largeChange;

        }

 

        public void DisableScrollOnMouseWheel()

        {

            scrollableControl.VisibleChanged -= OnVisibleChanged;

            UnsubscribeFromMouseWheel(scrollableControl.Controls);

            scrollableControl = null;

        }

    }

 

 

참고

https://www.devexpress.com/Support/Center/Question/Details/K18512/how-to-enable-scrolling-in-xtrascrollablecontrol-by-using-the-mouse-wheel

CheckedComboBoxEdit 에 PlaceHolderText 기능을 적용하기 위해

 

checkedComboBoxEdit.Properties.NullText = "선택하세요.";

 

위처럼 코딩했는데 아래처럼 화면에 표시 되지 않았다.

 

ComboBoxEdit 에서는 이상없이 표시 되던 것이 CheckedComboBoxEdit 표시가 되지 않는다.

 

확인해 보니 아래 처럼 코딩해서 원하는 기능을 처리할수 있었다.

 

checkedComboBoxEdit.Properties.NullValuePromptShowForEmptyValue = true;

checkedComboBoxEdit.Properties.NullValuePrompt = "선택하세요.";

 

 

참고

https://www.devexpress.com/Support/Center/Question/Details/B199845/nulltext-does-not-display-on-checkedcomboboxedit

CheckedListBoxControl 항목은 아래처럼 기본적으로 세로로 나열되어

나타단다.

 

이를 가로로 정렬되어 보이게 하려면 MultiColumn 값을 true 로 하면

아래 처럼 가로로 정렬된다.(컨트롤 높이 조정필요)

this.checkedListBoxControl.MultiColumn = true;

this.checkedListBoxControl.Height = 28;

 

유의할 점은 데이터들이 모두 세로로 정렬되기위한 공간이 충분한 경우 무조건 세로로 정렬된다.

this.checkedListBoxControl.MultiColumn = true;

위 코드만 처리한 경우 아래처럼 높이가 세로로 정렬되도 충분하여 세로로 정렬된다.

 

세로정렬로 모두 표현이 힘든 경우 가로로 정렬이 된다고 보면된다.

+ Recent posts