웹,윈폼,WPF 등을 모두 지원하며, 강력한(글쎄…) 그리드 기능이 있어 업무용 프로그램 용도로 사용할 만한(글쎄…) 라이브러리 입니다.
회사에서 이 제품을 사용하는데. 최근 문제가 좀 발견되었습니다.
(.NET Framework 4.0 용 12.2.20122.2123 버전)
문제는, 에디트박스에서 한글을 입력하다가 마우스 클릭 등으로 다른 곳으로 포커스를 옮길 경우, 마지막 입력된 한글 한 글자가 사라지는 현상입니다. 이 내용은 우리 회사로서는 최근 보고 되었지만(그 만큼 유저 수가 적다는 건가), 좀 검색을 해 보니, Infragistics 커뮤니티에 해당 문제 제기를 한 분이 있었습니다.
https://www.infragistics.com/community/forums/f/ultimate-ui-for-windows-forms/105014/ultratexteditor-bug-happens-in-windows-10
재차, 검색을 해 보니, 네이버 블로그에도 나오는데, 아마도 이 분이 저 질문을 올린 듯 하고, 어찌어찌 해결책을 찾아 제시해 주기도 하셨습니다.(대단… 저는 찾아보기만 할 뿐, 영어로 질문을 작성하진….)
http://tank51882.blog.me/220687584745
AlwaysInEditMode 를 true 로 세팅하면 해결이 된다는 답변이 있으나, 이렇게 될 경우, NullText(웹 input의 placeholder에 해당)도 사용할 수 없으며, 여러가지 제약이 있지 않을까 싶어 좀 더 근본적인 해결책이 필요하다 생각이 들었고, 후킹(?)까지도 해서 어떻게든 처리를 해야 하지 않을까 생각하게 되었죠. 사실, 이 문제는 테스트 해 본 결과, Windows 7, Windows 8 까지는 발생하지 않습니다. Windows 8.1, Windows 10 에서만 발생하는 현상 입니다.
정확히 어떤 내용인지는 상기 블로그에 들어가서 영상을 한 번 보시길.(또는 검색을 통해 이 글을 읽고 있다면, 그건, 문제를 알고 들어오신 거겠고요.)
착안은 그렇습니다.
우선, 인프라지스틱스의 모든 에디터는 Embedded 된 에디트 컨트롤이 따로 있으며, 이 객체는 키 입력 등으로 에디트를 시작할 때에만 접근이 가능하고(생성되고), 에디트가 종료되면 다시 null 로 바뀝니다.
그래서, 여러가지 이벤트핸들러를 통해 어느 시점에 제대로 된 한글이 보이는 지 체크했고, 그 와중에 KeyUp 이벤트를 잡아 낼 수 있었습니다.
일단은 간단하게, KeyUp 이벤트에서 어느 정도까지 제대로 입력되었다는 가정 하에, CurrentEditText 프로퍼티에 제대로 된 전체 글자들이 담겨 있음을 보고, 이 값을 잠시 저장해 두었다가, 에디트 종료 시점에 값(Value)과 비교, 치환해 주는 꼼수 코딩인 겁니다.
아직 테스트 해 보진 않았지만, 차 후 우리 시스템에도 적용할 지 여부를 다각도로 테스트 해 보려 합니다.
예제는 그냥 멤버 컨트롤에 이벤트를 붙였지만, 실 적용할 경우 상속받은 사용자 컨트롤 단에서 작업을 하면 전체 적용도 어렵진 않을 듯 합니다. 단지, 이로 인한 다른 문제가 발생하지 않을까 좀 두렵네요.
private void Init() { this.myUltraText.AfterEnterEditMode -= new EventHandler(MyText_AfterEnterEditMode); this.myUltraText.AfterEnterEditMode += new EventHandler(MyText_AfterEnterEditMode); } private void MyText_AfterEnterEditMode(object sender, EventArgs e) { try { UltraTextEditor ute = sender as UltraTextEditor; if (ute != null && ute.Editor != null) { ute.Editor.KeyUp -= new KeyEventHandler(Editor_KeyUp); ute.Editor.KeyUp += new KeyEventHandler(Editor_KeyUp); ute.Editor.BeforeExitEditMode -= new Infragistics.Win.BeforeExitEditModeEventHandler(Editor_BeforeExitEditMode); ute.Editor.BeforeExitEditMode += new Infragistics.Win.BeforeExitEditModeEventHandler(Editor_BeforeExitEditMode); } } catch { } } private string sValue1 = string.Empty; private string sValue2 = string.Empty; private void Editor_KeyUp(object sender, KeyEventArgs e) { EmbeddableEditorBase x = sender as EmbeddableEditorBase; if (x != null) { sValue1 = string.Format("{0}", x.Value); sValue2 = x.CurrentEditText; } } private void Editor_BeforeExitEditMode(object sender, Infragistics.Win.BeforeExitEditModeEventArgs e) { EmbeddableEditorBase x = sender as EmbeddableEditorBase; if (x != null && sValue1 != sValue2) { x.Value = sValue2; } }
덧붙여,
Infragistics 너무 짜증 나요. 사실, 그리드에서도 키 입력과 동시에 에디트가 가능하도록 별도의 코딩을 한 적이 있습니다.(영문으로는 기본적으로 가능하나, 이 때에도 한글로는 먹지 않아서요.)