2016-10-28 9 views
-1

미안하지만 사소한 일이지만 지난 며칠 동안 저를 괴롭혔습니다. 사용자가 셀 항목을 편집 할 수있는 DataGrid가 있습니다.CellEditEnding의 MessageBox가 DataGrid에서 버튼 기능의 실행을 방해하는 이유는 무엇입니까?

그리드의 ItemSource (목록)에 전달하기 전에 데이터를 확인하려면 CellEditEnding 이벤트에 바인딩 된 함수가 있습니다.

todayspecialextra.CellEditEnding += ExtraEntry_CellEditEnding; 

private void ExtraEntry_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) 
    { 
     if (e.EditAction == DataGridEditAction.Commit) 
     { 
        .... 
        // element.Text has the new, user-entered value 
        var element = e.EditingElement as TextBox; 
        int x; 
        if (!(int.TryParse(element.Text, out x) && x >= 0 && x <= 10)) 
        { 
         element.Text = "0"; 
         MessageBox.Show("Quantity allowed >0 and <10"); 
         Console.WriteLine("MessageBox Ended now!"); 
        } 
     } 
    } 


private void button_enter_Click(object sender, RoutedEventArgs e) 
{ 
    ... 
} 

일반적으로 사용자가 셀을 편집하고 잘못된 값을 입력하는 경우. 그는 메시지 박스 대화를 얻고 사용자가 여전히 셀을 편집 할 경우 값 자체는 0 로 변경 그러나 및 입력이 이가지 경우 유효하지 않은를가되었다 저장/버튼 및 를 입력 누르면 :

  1. cellEditEnding 이벤트가 먼저 트리거되고 (이유를 알 수 있습니까?) 위의 함수가 실행되어 MessageBox이 표시됩니다. 하지만 MessageBox를 닫으면 Console.WriteLine("MessageBox Ended now!");가 실행되고 원래의 Save/Button 기능이 실행되지 않습니다.

  2. 내가 MessageBox.Show() 라인에 댓글을 달았다면. cellEditEnding 이벤트가 트리거되고 위의 함수가 평소대로 실행되고 Save/Enter 버튼 함수의 코드가 실행됩니다.

왜 메시지 박스는 저장/입력 버튼 기능의 실행을 방지합니까?

P .: 입력이 유효하지 않은 경우 입력 버튼을 실행하고 싶지 않습니다. 그러나 MessageBox를 사용하여이를 달성하는 데 왜 도움이되는지 이해할 수 없습니까?

+0

MessageBox.Show는 UI 스레드를 차단한다. UI 스레드가 차단되었으므로 해고 된 버튼 이벤트가 누락됩니다. cellEditEnding이 먼저 실행되는 이유는 손실 단추를 클릭하면 손실 포커스를 편집하고 있던 셀이 버튼 클릭 이벤트 전에 cellEditEnding 이벤트를 발생시키기 때문입니다. – WBuck

+0

@WBuck 감사합니다. 그것은 그것을 설명합니다. MessageBox를 차단하는 것이 UI 스레드를 차단하지만 버튼 클릭 이벤트가 발생하지 않을 것이라는 것을 알지 못했습니다. 나는이 사건들이 대기 행렬에 올랐다 고 생각했다. cellEditEnding이 끝난 후에 버튼 클릭 이벤트가 시작됩니까? 아니오이면 UI 스레드가 이벤트를 수신하거나 수신하지 않을 수있는 경쟁 조건을 생성 할 수 있습니다. – n00buser

답변