미안하지만 사소한 일이지만 지난 며칠 동안 저를 괴롭혔습니다. 사용자가 셀 항목을 편집 할 수있는 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 로 변경 그러나 및 입력이 이가지 경우 유효하지 않은를가되었다 저장/버튼 및 를 입력 누르면 :
cellEditEnding 이벤트가 먼저 트리거되고 (이유를 알 수 있습니까?) 위의 함수가 실행되어 MessageBox이 표시됩니다. 하지만 MessageBox를 닫으면
Console.WriteLine("MessageBox Ended now!");
가 실행되고 원래의 Save/Button 기능이 실행되지 않습니다.내가
MessageBox.Show()
라인에 댓글을 달았다면. cellEditEnding 이벤트가 트리거되고 위의 함수가 평소대로 실행되고 Save/Enter 버튼 함수의 코드가 실행됩니다.
왜 메시지 박스는 저장/입력 버튼 기능의 실행을 방지합니까?
P .: 입력이 유효하지 않은 경우 입력 버튼을 실행하고 싶지 않습니다. 그러나 MessageBox를 사용하여이를 달성하는 데 왜 도움이되는지 이해할 수 없습니까?
MessageBox.Show는 UI 스레드를 차단한다. UI 스레드가 차단되었으므로 해고 된 버튼 이벤트가 누락됩니다. cellEditEnding이 먼저 실행되는 이유는 손실 단추를 클릭하면 손실 포커스를 편집하고 있던 셀이 버튼 클릭 이벤트 전에 cellEditEnding 이벤트를 발생시키기 때문입니다. – WBuck
@WBuck 감사합니다. 그것은 그것을 설명합니다. MessageBox를 차단하는 것이 UI 스레드를 차단하지만 버튼 클릭 이벤트가 발생하지 않을 것이라는 것을 알지 못했습니다. 나는이 사건들이 대기 행렬에 올랐다 고 생각했다. cellEditEnding이 끝난 후에 버튼 클릭 이벤트가 시작됩니까? 아니오이면 UI 스레드가 이벤트를 수신하거나 수신하지 않을 수있는 경쟁 조건을 생성 할 수 있습니다. – n00buser