С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/46: Рейтинг темы: голосов - 46, средняя оценка - 4.54
3 / 3 / 1
Регистрация: 13.12.2011
Сообщений: 89
1

Запрет ввода определенных символов в dataGridView

28.12.2012, 10:57. Показов 9243. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть таблица. Хочу чтобы кроме цифр и запятой вводить в ячейки ничего нельзя было. Кто подскажет.

Обычными обработчиками события у меня что-то не получается сделать, хотя в сети видел кучу примеров. И на этом сайте тоже. У кого есть готовое решение?

В обычных текстбоксах все работает, а в таблице -нет
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.12.2012, 10:57
Ответы с готовыми решениями:

Запрет ввода определенных символов в TextBox
Подскажите пожалуйста как с делать так чтобы при выборе в numericUpDown цифры 2 в textBox можно...

Запрет редактирования определенных колонок в DataGridView
Здравствуйте! Подскажите как запретить редактирование определенных колонок в DataGridView

Запрет на ввод определенных символов
Вообщем необходимо во время работы программы в ее рабочей области запретить вводить юзеру все...

Запрет ввода в datagridview
Как запретить ввод любых символов в datagridview?

10
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
28.12.2012, 11:56 2
У каждой колонки в DataGridView есть такое замечательное свойство, как DefaultCellStyle.Format. К нему можно и из дизайнера добраться. При помощи этого свойства и дизайнера, задача ввода в ячейку только чисел решается в пару кликов.
0
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
28.12.2012, 15:17 3
Как всегда рекомендую SourceGrid.

Если вам требуется хороший грид с огромными возможностями, используйте SourceGrid. Он тяжел в освоении, но если освоите - забудете про DataGridView =)
0
3 / 3 / 1
Регистрация: 13.12.2011
Сообщений: 89
29.12.2012, 08:21  [ТС] 4
а если освоить datagridview можно про sourcegrid и не вспоминать
0
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
29.12.2012, 09:32 5
bypass, вы работали с SourceGriв, Даже если и не работали, скажите пожалуйста, как сделать в DataGridView объединение ячеек? Это только одна из множества задач, решаемых на SourceGrid в одну строчку...

Что касается конкретно задачи автора, она решается на SourceGrid на порядок проще, чем на DataGridView.
0
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
29.12.2012, 10:08 6
Во-первых, хотел бы извиниться перед автором за не совсем правильный совет. Указанное мной свойство меняет только формат отображения колонки. Вводить туда можно все, что угодно. Валидация, конечно, все, что угодно не пропустит, но цель была, чтобы все, что угодно ввести нельзя было.
В DataGridView задачу можно решить примерно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void DataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    if (((DataGridView)sender).CurrentCell.OwningColumn.Name == "TotalAmount")
    {
        e.Control.KeyPress -= new KeyPressEventHandler(Control_KeyPress);
        e.Control.KeyPress += new KeyPressEventHandler(Control_KeyPress);
    }
}
 
void Control_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '.')
    e.KeyChar = ',';
    if (e.KeyChar == 3 || e.KeyChar == 24)
        e.Handled = false;
    else if (e.KeyChar != 22)
        e.Handled = !Char.IsDigit(e.KeyChar) && (e.KeyChar != ',' || (((TextBox)sender).Text.Contains(",") && !((TextBox)sender).SelectedText.Contains(","))) && e.KeyChar != (char)Keys.Back && (e.KeyChar != '-' || ((TextBox)sender).SelectionStart != 0 || (((TextBox)sender).Text.Contains("-") && !((TextBox)sender).SelectedText.Contains("-")));
    else
    {
        double d;
        e.Handled = !double.TryParse(Clipboard.GetText(), out d) || (d < 0 && (((TextBox)sender).SelectionStart != 0 || ((TextBox)sender).Text.Contains("-") && !((TextBox)sender).SelectedText.Contains("-"))) || ((d - (int)d) != 0 && ((TextBox)sender).Text.Contains(",") && !((TextBox)sender).SelectedText.Contains(","));
        if (e.Handled)
            MessageBox.Show("Не удалось произвести вставку из-за ограничений текущего поля ввода", "Предупреждение");
    }
}
Где Обработчик KeyPress можно написать самому по любой ссылке из интернета.
Сейчас нам Doomer3D продемонстрирует, насколько проще эта задача решается в SourceGrid
1
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
29.12.2012, 10:34 7
Цитата Сообщение от kodv Посмотреть сообщение
Сейчас нам Doomer3D продемонстрирует, насколько проще эта задача решается в SourceGrid
У меня складывается впечатление, что вы относитесь ко мне недружелюбно. Все время спорите и т.д.. Не надо так делать.

А что касается пример как это реализуется на SourceGrid - покажу, если найду время.

Но опять же, в который раз я обращаю снимание, что SourceGrid не нужен, если необходимо решить одну простую задачу и больше никогда не сталкиваться с ним, он необходим для тех, у кого такие задачи возникают часто. Я очень жалею, что раньше не знал о нем раньше и пытался решать все посредством DataGridView, реализуя в нем то, чего изначально не было.
0
3 / 3 / 1
Регистрация: 13.12.2011
Сообщений: 89
29.12.2012, 11:38  [ТС] 8
вот я по совету Doomer3D еще месяц назад ставил себе SourceGrid. Я не спорю. Это отличное решение. Но он правда сложный. Там и прозрачность ячеек поддерживается и каждой ячейки в столбце можно свой тип поставить. Это здорово. Но все равно в нем многое не понятно. А какой-то супер литературы по нему не нашел. Вот и забил на него. Может конечно и зря
0
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
29.12.2012, 11:43 9
Вообще, в SourceGrid код аналогичен, но нет необходимости привязывать события EditingControlShowing и KeyPress. Достаточно назначить для нужных ячеек свой редактор, примерно так:

C#
1
grid[currentRow, 1] = new SourceGrid.Cells.Cell(1.5, typeof(double));
Этот код создает ячейку со значением 1.5 и типов double, соответственно, нельзя будет ввести что-то, отличное от double, но для запрета ввода чего-то отличного от цифр есть смысл определить свой класс, наследованный от Cell или свой редактор, очень похожий на UITypeEditor или же в сделать привязку события KeyPress аналогично вашему примеру.

Пожалуй, в этом случае действительно пример проще не на порядок, а лишь на пол-порядка, но в SourceGrid этот код соответствует ООП, в отличие от метода динамической привязки и отвязки событий. Достаточно написать единожды свой класс для редактирования вещественных чисел и использовть его в дальнейшем в любом проекте.

Код не до конца совершенного класса-редактора double:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
 
using DevAge.ComponentModel;
using DevAge.ComponentModel.Converter;
 
namespace Auction.Grid
{
    public class DoubleTypeEditor : SourceGrid.Cells.Editors.TextBox
    {
        protected int _decimalLength;
        protected string _formatString;
 
        /// <summary>
        /// число десятичных знаков
        /// </summary>
        public int DecimalLength
        {
            get { return _decimalLength; }
            set
            {
                _decimalLength = value;
                _formatString = string.Format("N0{0}", _decimalLength);
            }
        }
 
        public DoubleTypeEditor(int decimalLength)
            : base(typeof(double))
        {
            this.DecimalLength = decimalLength;
            this.AllowNull = true;
        }
 
        protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
        {
            base.OnKeyPress(e);
 
            char c = e.KeyChar;
            e.Handled = !(char.IsDigit(c) || c == '.' || c == ',' || c == '\b');
        }
 
        protected override void OnConvertingObjectToValue(DevAge.ComponentModel.ConvertingObjectEventArgs e)
        {
            string str = ((e.Value as string) ?? "").Replace(" ", "").Replace('.', ',');
            if (string.IsNullOrEmpty(str))
            {
                e.Value = 0;
                e.ConvertingStatus = ConvertingStatus.Completed;
            }
            else
            {
                double val;
                if (double.TryParse(str, out val))
                {
                    e.Value = Math.Round(val, DecimalLength);
                    e.ConvertingStatus = ConvertingStatus.Completed;
                }
                else
                {
                    e.ConvertingStatus = ConvertingStatus.Error;
                }
            }
        }
 
        protected override void OnConvertingValueToObject(ConvertingObjectEventArgs e)
        {
            if (e.Value is double)
            {
                e.Value = ((double)e.Value).ToString(_formatString).Replace(',', '.');
                e.ConvertingStatus = ConvertingStatus.Completed;
            }
            else
            {
                base.OnConvertingValueToObject(e);
            }
        }
 
        public override string ValueToDisplayString(object p_Value)
        {
            if (p_Value is double)
            {
                return ((double)p_Value).ToString(_formatString).Replace(',', '.');
            }
            else
            {
                return base.ValueToDisplayString(p_Value);
            }
        }
 
        public override bool SetCellValue(SourceGrid.CellContext cellContext, object p_NewValue)
        {
            if (p_NewValue is double)
            {
                cellContext.Value = (double)p_NewValue;
                return true;
            }
            else
            {
                return base.SetCellValue(cellContext, p_NewValue);
            }
        }
 
        public override void ClearCell(SourceGrid.CellContext cellContext)
        {
            cellContext.Value = 0d;
        }
    }
}


В дальнейшем достаточно добавлять этот редактор к нужным ячейкам грида. А чтобы он был вообще классным, добавить код kodv'а в метод OnKeyPress.
1
180 / 180 / 32
Регистрация: 23.11.2012
Сообщений: 344
Записей в блоге: 1
29.12.2012, 11:53 10
Цитата Сообщение от bypass Посмотреть сообщение
Но он правда сложный.
Поверьте, я тоже так считал вначале, долго трахался мучился с ним, но потом все же осилил и теперь могу создать на нем то, на что DataGridView попросту не способен, пример на скриншоте.

"123" и "бла-бла-бла" - это ссылки (кстати, их в DataGridView нету), плюсик и минусик - кнопочки, да и сама ячейка демонстрирует мощь SourceGrid.

И в 100500 раз обращаю внимание, что это не какая-то реклама SourceGrid (мне от этого никакой пользы нет), а просто совет программистам, как они могут упростить себе жизнь, если один раз изучат этот с первого раза сложный в понимании грид.

Что касается методов изучения, рекомендую скачать SourceGrid с исходниками, там в последних версиях есть ОГРОМНЫЙ набор примеров почти на все случаи жизни - это лучше, чем какая-то литература о нем.

Не по теме:

Может мне написать по нему книжку? =)

Миниатюры
Запрет ввода определенных символов в dataGridView  
1
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
29.12.2012, 15:16 11
Doomer3D, я не спорю, что SourceGrid гораздо более функцональный, чем DataGridView. Не только от вас я это слышал. Но, как говорил когда то мой преподаватель по программированию: "Зачем загонять в огород трактор, если нужно вскопать одну грядку?". С какими то простыми задачами и DataGridView справится прекрасно - это не TDBGrid из BCB. Если уж нужна реализация чего то более серьезного, то DataGridView в том виде, в котором он есть, плохо подходит.
0
29.12.2012, 15:16
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2012, 15:16
Помогаю со студенческими работами здесь

Запрет ввода вручую в DataGridView
ребята подскажите пожалуйста как в dataGridView ограничить ручной ввод?чтоб записи добавлялись лишь...

Запрет ввода в ячейку DataGridView
Здравствуйте, форумчане. Прошу помощи, так как самому разобраться не получается. Хочу написать...

Запрет ввода определенных символов в Edit
Я искал на форуме и в гугле, нашел разные варианты, но не нашел который мне бы подошел... Ведь у...

Запрет ввода определенных символов в dbgrid
Добрый вечер! Ввожу данные непосредственно dbgrid, как мне запретить ввод знаков кроме чисел в...

Запрет ввода определённых символов в scanf
всем привет, я тут впервые так что не пинайте за может глупые на ваш взгляд вопросы. я только...

Запрет ввода в TextBox определенных символов
В общем проблема такая, пол дня уже пытаюсь выполнить небольшое задание... Нужно поставить защиту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
Полезные поделки на Arduino, которые можно сделать самому
raxper 06.01.2025
Arduino как платформа для творчества Arduino представляет собой удивительную платформу для технического творчества, которая открывает безграничные возможности для создания уникальных проектов. Эта. . .
Подборка решений задач на Python
IT_Exp 06.01.2025
Целью данной подборки является предоставление возможности ознакомиться с различными задачами и их решениями на Python, что может быть полезно как для начинающих, так и для опытных программистов. . . .
С чего начать программировать микроконтроллер­­ы
raxper 06.01.2025
Введение в мир микроконтроллеров Микроконтроллеры стали неотъемлемой частью современного мира, окружая нас повсюду: от простых бытовых приборов до сложных промышленных систем. Эти маленькие. . .
Из чего собрать игровой компьютер
inter-admin 06.01.2025
Сборка игрового компьютера требует особого внимания к выбору комплектующих и их совместимости. Правильно собранный игровой ПК не только обеспечивает комфортный геймплей в современных играх, но и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru