300x250
Devexpress 의 SpreadsheetControl에서 셀 영역을 드래그해서 다른 셀에 드롭할 때, 두 영역 모두 값이 있었다면
"Do you want to replace the contents of the destination cells?" 라는 메세지 박스가 나오고 확인을 누르면 셀 대상 바꾸기가 된다.
문제는 이 기능이 Devexpress 라이브러리 내부에서 넣은 기능이라 외부에서 컨트롤할 수 없다.
다행히 ReplaceService 함수를 통해 해당 기능을 중간에 가져올 수 있다고 한다.
다만 위에서 제공하는 코드는 약 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));
단순히 메세지박스를 비활성화하는 것 말고도
다국어 작업을 하거나(기본 영어 말고 한글로 나오게 하는 등) 다른 동작을 하게 만들수도 있다.
반응형
'공부 > Devexpress' 카테고리의 다른 글
[Devexpress Winform] GridView 에서 ValidatingEditor 이벤트때 변경 전 데이터 가져오기 (0) | 2025.01.05 |
---|