Элемент управления 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
Blazor использует элемент управления вводом для даты или DateTime ⇐ C#
Место общения программистов C#
-
Anonymous
1763827844
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;
}
}
}
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79827420/blazor-using-input-control-for-date-or-datetime[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия