Blazor использует элемент управления вводом для даты или DateTimeC#

Место общения программистов C#
Ответить
Anonymous
 Blazor использует элемент управления вводом для даты или DateTime

Сообщение Anonymous »

Элемент управления InputDate работает нормально для захвата ввода даты или даты и времени, за исключением одного: невозможно вставить значение в элемент управления.
Я попробовал создать элемент управления, который наследуется от ввода. Он использует строку со значением, которое позволяет мне управлять форматированием, положением курсора и т. д. Проблема этого подхода в том, что я не могу понять, как привязать элемент управления к дате и сохранить ту же функциональность. Вот код элемента управления. Оно еще не завершено, но достаточно полно, чтобы отобразить проблему. Может ли кто-нибудь помочь мне привязать это к дате или дате и времени и при этом сохранить возможность вставки значения?
@using System.Text.RegularExpressions
@inject IJSRuntime JsRuntime
@inherits InputText


window.getSelectionFromInput = (element) => {
if (element && element.value !== undefined) {
const start = element.selectionStart;
const end = element.selectionEnd;
// Return the substring of the input value that is selected
return element.value.substring(start, end);
}
return "";
};

window.getCursorPosition = (element) => {
if (element) {
// selectionStart returns the character offset of the caret
return element.selectionStart;
}
return 0;
}




@code {
private ElementReference myInputText;

protected void OnBlurEventHandler(FocusEventArgs e)
{
if (string.IsNullOrWhiteSpace(CurrentValueAsString))
{
return;
}

if (!Regex.IsMatch(CurrentValueAsString, @"^(0[1-9]|1[012])[- /. ](0[1-9]|[12][0-9]|3[01])[- /. ](19|20)\\d\\d$"))
{
var number = Regex.Replace(CurrentValueAsString, @"[\s()-]", "");
//CurrentValueAsString = Regex.Replace(number, @"(\d{3})(\d{3})(\d{4})", "($1) $2-$3");
}

if (CurrentValueAsString.Length > 10)
{
CurrentValueAsString = CurrentValueAsString.Substring(0, 10);
}
}

protected async void OnKeyPressEventHandler(KeyboardEventArgs e)
{
if (string.IsNullOrWhiteSpace(CurrentValueAsString))
{
CurrentValueAsString = string.Empty;
}

var key = (string)e.Key;
if (Regex.IsMatch(key, "[0-9]"))
{
var selectedText = await JsRuntime.InvokeAsync("getSelectionFromInput", myInputText);
//var cursorPosition = await JSRuntime.InvokeAsync("getCursorPosition", myInputText);
var cursorPosition = await JsRuntime.InvokeAsync("getCursorPosition", myInputText);

if (selectedText.Length > 0)
{
if (cursorPosition < 2)
{
CurrentValueAsString = CurrentValueAsString.Replace(selectedText + "/", key + "/");
}
else if (cursorPosition > 2 && cursorPosition < 5)
{
CurrentValueAsString = CurrentValueAsString.Replace("/" + selectedText, "/" + key);
}
else if (cursorPosition > 5)
{
CurrentValueAsString = CurrentValueAsString.Substring(0, cursorPosition) + key;
}
}
else
{
if (cursorPosition < CurrentValueAsString.Length)
{
if (cursorPosition == 0)
{
if (CurrentValueAsString.Substring(1, 1) == "/")
{
CurrentValueAsString = key + CurrentValueAsString;
}
}
else if (cursorPosition == 1)
{
CurrentValueAsString = CurrentValueAsString.Substring(0, 1) + key + CurrentValueAsString.Substring(2);
CurrentValueAsString = CurrentValueAsString.Replace("//", "/");
// Check the month
}
else if (cursorPosition == 3)
{
CurrentValueAsString = CurrentValueAsString.Substring(0, 3) + key + CurrentValueAsString.Substring(4);
}
//CurrentValueAsString = CurrentValueAsString.Substring(0, cursorPosition) + key;
}
else if (CurrentValueAsString?.Length < 10 && Regex.IsMatch(key, "[0-9]"))
{
CurrentValueAsString += CurrentValueAsString.Length switch
{
0 => $"{key}",
1 => $"{key}/",
2 => $"{key}",
3 => $"{key}",
4 => $"{key}/",
5 => $"{key}",
6 => $"{key}",
7 => $"{key}",
8 => $"{key}",
9 => $"{key}",
_ => $"{key}"
};
}
}
ValidateMonth();
ValidateDay();
}
}

private void ValidateMonth()
{
if (CurrentValueAsString is not null)
{
if (CurrentValueAsString.Contains("/"))
{
int monthSlash = CurrentValueAsString.IndexOf("/");
int monthSection = Convert.ToInt32(CurrentValueAsString.Substring(0, monthSlash));
if (monthSection > 12)
{
CurrentValueAsString = string.Empty;
}
}
}
}

private void ValidateDay()
{
if (CurrentValueAsString is not null)
{
if (CurrentValueAsString.Contains("/"))
{
int monthSlash = CurrentValueAsString.IndexOf("/");
if (monthSlash > 0)
{
int monthSection = Convert.ToInt32(CurrentValueAsString.Substring(0, monthSlash));
int yearSlash = CurrentValueAsString.IndexOf("/", monthSlash + 1);
if (yearSlash > 0)
{
int daySection = Convert.ToInt32(CurrentValueAsString.Substring(monthSlash + 1, yearSlash - monthSlash - 1));

int maxDay = 29;
if (monthSection == 1 || monthSection == 3 || monthSection == 5 || monthSection == 7 || monthSection == 8 || monthSection == 10 || monthSection == 12)
{
maxDay = 31;
}
else if (monthSection != 2)
{
maxDay = 30;
}

if (daySection < 1 || daySection > maxDay)
{
CurrentValueAsString = string.Empty;
}
}
}
}
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... r-datetime
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»