У меня есть требование, чтобы я хотел создать datagridcolumn, который принимает только числовые значения (integer), когда пользователь вводит что-то другое, кроме чисел, обрабатывающих текстовое поле. Я пробовал много веб-страниц, я устал от них, я очень признателен, что у кого-то есть помощь.wpf datagrid: создать DatagridNumericColumn в wpf
ответ
основе @nit предложение, вы можете создать свой собственный класс, производный от DataGridTextColumn
так:
public class DataGridNumericColumn : DataGridTextColumn
{
protected override object PrepareCellForEdit(System.Windows.FrameworkElement editingElement, System.Windows.RoutedEventArgs editingEventArgs)
{
TextBox edit = editingElement as TextBox;
edit.PreviewTextInput += OnPreviewTextInput;
return base.PrepareCellForEdit(editingElement, editingEventArgs);
}
void OnPreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
try
{
Convert.ToInt32(e.Text);
}
catch
{
// Show some kind of error message if you want
// Set handled to true
e.Handled = true;
}
}
}
В методе PrepareCellForEdit вы регистрируете метод OnPreviewTextInput
на редактирование TextBox
PreviewTextInput событие, в котором вы проверяете числовые значения.
В XAML, вы просто использовать:
<DataGrid ItemsSource="{Binding SomeCollection}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding NonNumericProperty}"/>
<local:DataGridNumericColumn Binding="{Binding NumericProperty}"/>
</DataGrid.Columns>
</DataGrid>
Надеется, что это помогает
его работающий друг спасибо – Mussammil
Если вы не хотите показывать какие-либо ошибки проверки и хотите заблокировать любое значение, отличное от числа, то вы можете создать DataGridTemplateColumn
и в CellEditingTemplate
использовать TextBox
.
<DataGridTemplateColumn Width="100*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=NumericProperty}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox PreviewTextInput="TextBox_PreviewTextInput" Text="{Binding Path=NumericProperty}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
и PreviewTextInput
в TextBox установлен e.Handled = true
если значение кроме целого числа:
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
try
{
Convert.ToInt32(e.Text);
}
catch
{
e.Handled = true;
}
}
спасибо, но на самом деле я не могу использовать DataGridTemplateColumn в своем запросе – Mussammil
Я получил сюда в поиски решения тех же задачи: сдерживая вход в клетки на DataGrid
быть числовыми. Но принятый ответ не сработал для меня. Следующее сделал:
- Для
DataGrid
добавить обработчик событий дляPreparingForCellEdit
. - В этом случае обработчик, нанесите
EditingElement
наTextBox
и добавьте обработчик события дляPreviewTextInput
вTextBox
. - В обработчике событий
PreviewTextInput
установленe.Handled
в true, если вход не допускается.
Вышеуказанные шаги работают, если пользователь нажимает на ячейку для редактирования. Однако, если ячейка не находится в режиме редактирования, событие PreparingForCellEdit
не будет вызываться. Для выполнения проверки в этом случае:
- Добавление обработчика событий в
DataGrid
дляPreviewTextInput
. - В этом обработчике событий, смело отбрасывать
e.OriginalSource
кDataGridCell
(выходу, если это неDataGridCell
), проверьте свойствоDataGridCell's
IsEditing
, и если ячейка не редактирование установитьe.Handled
истину.
Эффект выше является то, что пользователь должен нажать на ячейку, чтобы отредактировать его содержимое и, таким образом, сочетание PreparingForCellEdit
/PreviewTextInput
выше будет вызываться для всех изменений содержимого ячейки.
Вместо этого используйте TryParse
, это помогает ограничить входные значения только целыми числами.
/// <summary>
/// This class help to create data grid cell which only support interger numbers.
/// </summary>
public class DataGridNumericColumn : DataGridTextColumn
{
protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
{
TextBox edit = editingElement as TextBox;
if (edit != null) edit.PreviewTextInput += OnPreviewTextInput;
return base.PrepareCellForEdit(editingElement, editingEventArgs);
}
private void OnPreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e)
{
int value;
if (!int.TryParse(e.Text, out value))
e.Handled = true;
}
}
Просто продлить @ ответ Omribitan, вот это решение с данными Paste
добавил охранник:
public class NumericTextColumn : DataGridTextColumn
{
protected override object PrepareCellForEdit(FrameworkElement editingElement, RoutedEventArgs editingEventArgs)
{
var edit = editingElement as TextBox;
edit.PreviewTextInput += Edit_PreviewTextInput;
DataObject.AddPastingHandler(edit, OnPaste);
return base.PrepareCellForEdit(editingElement, editingEventArgs);
}
private void OnPaste(object sender, DataObjectPastingEventArgs e)
{
var data = e.SourceDataObject.GetData(DataFormats.Text);
if (!IsDataValid(data)) e.CancelCommand();
}
private void Edit_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
e.Handled = !IsDataValid(e.Text);
}
bool IsDataValid(object data)
{
try
{
Convert.ToInt32(data);
return true;
}
catch
{
return false;
}
}
}
- 1. wpf Datagrid: Combobox Интеграция в wpf datagrid
- 2. Группировка в WPF Datagrid?
- 3. Как программно создать DataGrid в C# WPF?
- 4. Редактируемый Datagrid в WPF
- 5. DataGrid в WPF selectedRow
- 6. Настроить DataGrid в WPF
- 7. WPF DataGrid в ComboBox
- 8. Colspan в WPF DataGrid
- 9. Подтвердить datagrid в wpf
- 10. DataGrid в WPF
- 11. Ошибка в WPF DataGrid
- 12. WPF: CheckBox в DataGrid
- 13. DataGrid в WPF
- 14. WPF DataGrid с диапазонами
- 15. C# WPF datagrid: ItemsSource
- 16. WPF DataGrid CellTemplateSelector Item
- 17. WPF datagrid auto filter
- 18. WPF DataGrid style-Silverlight DataGrid?
- 19. WPF вход datagrid?
- 20. WPF DataGrid Header styling
- 21. Пользовательский контроль DataGrid WPF
- 22. WPF DataGrid привязки проблема
- 23. Checkbox с DataGrid WPF
- 24. Как создать WPF DataGrid Text + Button Column?
- 25. WPF DataGrid MultiSelect
- 26. Обновление DataGrid C# WPF
- 27. WPF DataGrid ContentControll bindng
- 28. WPF DataGrid внутри DataGrid.RowDetailsTemplate
- 29. DataGrid подобно Outlook в WPF
- 30. Слияние ячеек в WPF DataGrid
Вы можете создать свой собственный класс, производный от 'DataGridColumn' и преформ цифровой проверки там .. –
@Omribitan, если у вас есть какие-либо примеры, вы опубликуете ссылку, это будет отличная помощь для меня – Mussammil