공부/Devexpress

[Devexpress Winform] 스프레드 시트 컨트롤 셀 대상 바꾸기 메세지박스 가로채기

복제고양이 2025. 1. 6. 12:09
300x250

Devexpress 의 SpreadsheetControl에서 셀 영역을 드래그해서 다른 셀에 드롭할 때, 두 영역 모두 값이 있었다면 

"Do you want to replace the contents of the destination cells?" 라는 메세지 박스가 나오고 확인을 누르면 셀 대상 바꾸기가 된다.

 

문제는 이 기능이 Devexpress 라이브러리 내부에서 넣은 기능이라 외부에서 컨트롤할 수 없다.

다행히 ReplaceService 함수를 통해 해당 기능을 중간에 가져올 수 있다고 한다.

 

 

how to intercept the spreadsheets control "Do you want to replace the contents of the destination cells?" message ?

You have yet to view any tickets. Your search criteria do not match any tickets. A server error occurred while processing your request. Please try again at a later time.

supportcenter.devexpress.com

 

 

다만 위에서 제공하는 코드는 약 9년전 글이기 때문에 지금 내가 사용하는 버전에서는 맞지 않았다.

IMessageBoxService에서 구현해야하는 인터페이스가 DialogResult 에서 PortableDialogResult 을 리턴하도록 바뀐 것 같다. 

 

그래서 아래와 같이 수정했다. 

 

PortableDialogResult 의 내용은 DialogResult와 동일하다. 그냥 형변환만 해주면 잘 맞는다.

 

 

using System.Windows.Forms;
using DevExpress.LookAndFeel;
using DevExpress.Portable;
using DevExpress.XtraEditors;
using DevExpress.XtraSpreadsheet.Localization;
using DevExpress.XtraSpreadsheet.Services;

namespace EditorApp
{
    public class CustomMessageBoxService : IMessageBoxService {
        readonly Control control;
        readonly UserLookAndFeel lookAndFeel;
        public CustomMessageBoxService(Control control, UserLookAndFeel lookAndFeel) {
            this.control = control;
            this.lookAndFeel = lookAndFeel;
        }
        PortableDialogResult IMessageBoxService.ShowMessage(string message, string title, PortableMessageBoxIcon icon)
        {
            return (PortableDialogResult)XtraMessageBox.Show(lookAndFeel, control, message, title, MessageBoxButtons.OK, (MessageBoxIcon)icon);
        }
        PortableDialogResult IMessageBoxService.ShowDataValidationDialog(string message, string title, DevExpress.Spreadsheet.DataValidationErrorStyle errorStyle) {
            MessageBoxButtons buttons;
            MessageBoxIcon icon;
            if(errorStyle == DevExpress.Spreadsheet.DataValidationErrorStyle.Stop) {
                buttons = MessageBoxButtons.RetryCancel;
                icon = MessageBoxIcon.Error;
            }
            else if(errorStyle == DevExpress.Spreadsheet.DataValidationErrorStyle.Warning) {
                buttons = MessageBoxButtons.YesNoCancel;
                icon = MessageBoxIcon.Warning;
            }
            else {
                buttons = MessageBoxButtons.OKCancel;
                icon = MessageBoxIcon.Information;
            }
            return (PortableDialogResult)XtraMessageBox.Show(lookAndFeel, control, message, title, buttons, icon);
        }
        public bool ShowOkCancelMessage(string message) {
            if(message == XtraSpreadsheetLocalizer.GetString(XtraSpreadsheetStringId.Msg_CanReplaceTheContentsOfTheDestinationCells)) {
                //Do you want to replace the contents of the destination cells? 메세지박스 비활성 후 바로적용
                return true;
            }
            else {
                return DialogResult.OK == XtraMessageBox.Show(lookAndFeel, control, message, Application.ProductName, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            }
        }
        public bool ShowYesNoMessage(string message) {
            return DialogResult.Yes == XtraMessageBox.Show(lookAndFeel, control, message, Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
        }
        PortableDialogResult IMessageBoxService.ShowYesNoCancelMessage(string message) {
            return (PortableDialogResult)XtraMessageBox.Show(lookAndFeel, control, message, Application.ProductName, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information);
        }
    }
}

 

위의 클래스를 만들고 아래와 같이 적용한다.

 

SpreadsheetControl _sc; //스프레드시트 컨트롤이 구현되어있다고 가정

_sc.ReplaceService(typeof(IMessageBoxService), new CustomMessageBoxService(_sc, _sc.LookAndFeel));

 

단순히 메세지박스를 비활성화하는 것 말고도

다국어 작업을 하거나(기본 영어 말고 한글로 나오게 하는 등) 다른 동작을 하게 만들수도 있다.

반응형