BalzorDatasheet 를 사용하면 sheet 내부에 select type 으로 콤보를 표시하는 경우
콤보박스를 열어놓은 상태에서 sheet 를 벗어난 영역을 클릭하면 콤보박스가 닫히지 않고 남아 있습니다.
Sheet 내부를 클릭하면 정상적으로 닫히지만, 외부 클릭 시에도 닫히게 하려면 BlazorDatasheet의 소스를 수정해야 합니다.
아래 //추가 라고 표시된 내용을 추가하고
class PointerInputService {
pointerEnterCallbackName;
pointerDoubleClickCallbackName;
pointerDownExternalClickCallbackName; // 추가
constructor(sheetElement, dotnetHelper) {
this.dotnetHelper = dotnetHelper;
this.sheetElement = sheetElement;
this.currentRow = -1
this.currentCol = -1
document.addEventListener('pointerdown', this.onHandleDocumentClick.bind(this)); // 추가
}
// 인자 추가
registerPointerEvents(pointerUpCallbackName, pointerDownCallbackName, pointerMoveCallbackName, pointerEnterCallbackName, pointerDoubleClickCallbackName, pointerDownExternalClickCallbackName) {
this.pointerUpCallbackName = pointerUpCallbackName;
this.pointerDownCallbackName = pointerDownCallbackName;
this.pointerMoveCallbackName = pointerMoveCallbackName;
this.pointerEnterCallbackName = pointerEnterCallbackName;
this.pointerDoubleClickCallbackName = pointerDoubleClickCallbackName;
this.pointerDownExternalClickCallbackName = pointerDownExternalClickCallbackName; // 추가
this.sheetElement.addEventListener('pointerup', this.onPointerUp.bind(this));
this.sheetElement.addEventListener('pointerdown', this.onPointerDown.bind(this));
this.sheetElement.addEventListener('dblclick', this.onDoubleClick.bind(this));
this.sheetElement.addEventListener('pointermove', this.onPointerMove.bind(this));
}
onHandleDocumentClick 를 정의합니다.
// 추가
onHandleDocumentClick(e) {
// Sheet 내부 클릭은 무시
if (this.sheetElement.contains(e.target)) {
return;
}
// Sheet 외부 클릭 시 Blazor로 알려줌
this.dotnetHelper.invokeMethodAsync(this.pointerDownExternalClickCallbackName);
}
위 수정한 sheet-pointer-input.js 의 내용에 맞게 소스를 수정해야합니다.
아래 // 추가 표시된 내용을 추가합니다.
public EventHandler<EventArgs>? ExternalPointerDown; // 추가
public async Task Init()
{
_dotNetObjectReference = DotNetObjectReference.Create(this);
var module =
await Js.InvokeAsync<IJSObjectReference>("import", "./_content/BlazorDatasheet/js/sheet-pointer-input.js");
_inputJs = await module.InvokeAsync<IJSObjectReference>(
"getInputService",
_sheetElement,
_dotNetObjectReference);
await _inputJs.InvokeVoidAsync(
"registerPointerEvents",
nameof(HandlePointerUp),
nameof(HandlePointerDown),
nameof(HandlePointerMove),
nameof(HandlePointerCellEnter),
nameof(HandlePointerDoubleClick),
nameof(HandleExternalPointerDown)); // 추가
await module.DisposeAsync();
}
호출될 dotnet function 을 정의합니다.
// 추가
[JSInvokable(nameof(HandleExternalPointerDown))]
public void HandleExternalPointerDown()
{
ExternalPointerDown?.Invoke(this, EventArgs.Empty);
}
위 SheetPointerInputService.cs 에서ExternalPointerDown 이벤트를 사용해 sheet 의 edit 상태를 취소하면됩니다.
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
if (GridLevel > 0)
return;
_dotnetHelper = DotNetObjectReference.Create(this);
_sheetPointerInputService = new SheetPointerInputService(Js, _sheetContainer);
await _sheetPointerInputService.Init();
_sheetPointerInputService.PointerDown += HandleCellMouseDown;
_sheetPointerInputService.PointerEnter += HandleCellMouseOver;
_sheetPointerInputService.PointerDoubleClick += HandleCellDoubleClick;
_sheetPointerInputService.ExternalPointerDown += HandleExternalPointerDown; // 추가
await AddWindowEventsAsync();
}
_renderRequested = false;
_sheetIsDirty = false;
_dirtyRegions.Clear();
await base.OnAfterRenderAsync(firstRender);
}
// 추가
private void HandleExternalPointerDown(object? sender, EventArgs e)
{
if (_sheet.Editor.IsEditing)
{
_sheet.Editor.CancelEdit();
//StateHasChanged();
}
}
이제 아래처럼 sheet 영역을 벗어나 클릭을 하게되면 콤보 표시가 사라지는걸 확인 할 수 있습니다.
The SSL connection could not be established 에러 해결 방법 (0) | 2025.06.12 |
---|---|
MudDataGrid 에서 Shift 키로 다중 항목 선택하기 (0) | 2025.05.23 |
BlazorDatasheet 의 select(콤보) 텍스트 입력 막기 (0) | 2025.04.20 |
BlazorDatasheet 의 ComboBox 를 MudButton 이 가리는 증상 해결하기 (0) | 2025.03.29 |
MudBlazor.Extensions 사용하기 - MudExSplitter (0) | 2025.03.24 |