Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614

Ввод в ячейку DataGridView только даты

10.02.2016, 15:34. Показов 4885. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем! Нужна помощь.
Мне нужно в определенном столбце контроллера DataGridView во всех ячейках вводить только символы, касающиеся даты - тоесть можно ввести только две цифры, потом только точку, потом опять две цифры, потом опять точку, и потом только 4 цифры. И никаких букв
Тоесть если пользователь вводит в ячейку вот так:
2
потом пытается ввести точку, то ему пишет сообщение, что Вы должны ввести еще одну цифру...
Думаю понятно, да?

Когда то использовал вот такой код для ввода только численных данных в ячейку 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 static KeyPressEventHandler NumericCheckHandler = new KeyPressEventHandler(NumericCheck);
private int indexOfColumn = 2;
...
private static void NumericCheck(object sender, KeyPressEventArgs e)
{
    DataGridViewTextBoxEditingControl s = sender as DataGridViewTextBoxEditingControl;
    if (s != null && (e.KeyChar == '.' || e.KeyChar == ','))
    {
        e.KeyChar = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator[0];
        e.Handled = s.Text.Contains(e.KeyChar);
    }
    else
        e.Handled = !char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar);
}
 
private void dataGridView2_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    if (dataGridView2.CurrentCell.ColumnIndex == indexOfColumn )
    {
        e.Control.KeyPress -= NumericCheckHandler;
        e.Control.KeyPress += NumericCheckHandler;
    }
}
...
Как мне его модифицировать, чтобы сделать то, что я описал выше? Помогите пожалуйста
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2016, 15:34
Ответы с готовыми решениями:

Ввод текущей системной даты в ячейку
как сделать так что бы при нажатии на кнопку текущая системная дата вводилась в ячейку Access

Форматированный ввод в ячейку DataGridView
Всем здравствуйте. Если у столбца установлено свойство Format (в свойстве DefaultCellStyle), например, число с двумя знаками после...

Cинxронный ввод в textbox и ячейку datagridview
Всем добрый день!! Подскажите пожалуйста новичку как сделать синxронный ввод в textbox и ячейку datagridview т.е при редактровании текста...

8
6 / 6 / 1
Регистрация: 20.02.2015
Сообщений: 114
10.02.2016, 15:41
Может эта тема поможет.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
10.02.2016, 17:14  [ТС]
Я нашел лучше вариант на MSDN, это сделать кастомную колонку - DateTimePicker.
Вот код реализации кому нужен:
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
    public class CalendarColumn : DataGridViewColumn
    {
        public CalendarColumn()
            : base(new CalendarCell())
        {
        }
 
        public override DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                // Ensure that the cell used for the template is a CalendarCell.
                if (value != null && !value.GetType().IsAssignableFrom(typeof(CalendarCell)))
                {
                    throw new InvalidCastException("Must be a CalendarCell");
                }
                base.CellTemplate = value;
            }
        }
    }
 
    public class CalendarCell : DataGridViewTextBoxCell
    {
 
        public CalendarCell()
            : base()
        {
            // Use the short date format.
            this.Style.Format = "d";
        }
 
        public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            // Set the value of the editing control to the current cell value.
            base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
            CalendarEditingControl ctl = DataGridView.EditingControl as CalendarEditingControl;
 
            // Use the default row value when Value property is null.
            if (this.Value == null)
            {
                ctl.Value = (DateTime)this.DefaultNewRowValue;
            }
            else
            {
                ctl.Value = (DateTime)this.Value;
            }
        }
 
        public override Type EditType
        {
            get
            {
                // Return the type of the editing control that CalendarCell uses.
                return typeof(CalendarEditingControl);
            }
        }
 
        public override Type ValueType
        {
            get
            {
                // Return the type of the value that CalendarCell contains.
 
                return typeof(DateTime);
            }
        }
 
        public override object DefaultNewRowValue
        {
            get
            {
                // Use the current date and time as the default value.
                return DateTime.Now;
            }
        }
    }
 
    class CalendarEditingControl : DateTimePicker, IDataGridViewEditingControl
    {
        DataGridView dataGridView;
        private bool valueChanged = false;
        int rowIndex;
 
        public CalendarEditingControl()
        {
            this.Format = DateTimePickerFormat.Short;
        }
 
        // Implements the IDataGridViewEditingControl.EditingControlFormattedValue property.
        public object EditingControlFormattedValue
        {
            get
            {
                return this.Value.ToShortDateString();
            }
            set
            {
                if (value is String)
                {
                    try
                    {
                        // This will throw an exception of the string is 
                        // null, empty, or not in the format of a date.
                        this.Value = DateTime.Parse((String)value);
                    }
                    catch
                    {
                        // In the case of an exception, just use the 
                        // default value so we're not left with a null
                        // value.
                        this.Value = DateTime.Now;
                    }
                }
            }
        }
 
        // Implements the IDataGridViewEditingControl.GetEditingControlFormattedValue method.
        public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
        {
            return EditingControlFormattedValue;
        }
 
        // Implements the IDataGridViewEditingControl.ApplyCellStyleToEditingControl method.
        public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
        {
            this.Font = dataGridViewCellStyle.Font;
            this.CalendarForeColor = dataGridViewCellStyle.ForeColor;
            this.CalendarMonthBackground = dataGridViewCellStyle.BackColor;
        }
 
        // Implements the IDataGridViewEditingControl.EditingControlRowIndex property.
        public int EditingControlRowIndex
        {
            get
            {
                return rowIndex;
            }
            set
            {
                rowIndex = value;
            }
        }
 
        // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey method.
        public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
        {
            // Let the DateTimePicker handle the keys listed.
            switch (key & Keys.KeyCode)
            {
                case Keys.Left:
                case Keys.Up:
                case Keys.Down:
                case Keys.Right:
                case Keys.Home:
                case Keys.End:
                case Keys.PageDown:
                case Keys.PageUp:
                    return true;
                default:
                    return !dataGridViewWantsInputKey;
            }
        }
 
        // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit method.
        public void PrepareEditingControlForEdit(bool selectAll)
        {
            // No preparation needs to be done.
        }
 
        // Implements the IDataGridViewEditingControl.RepositionEditingControlOnValueChange property.
        public bool RepositionEditingControlOnValueChange
        {
            get
            {
                return false;
            }
        }
 
        // Implements the IDataGridViewEditingControl.EditingControlDataGridView property.
        public DataGridView EditingControlDataGridView
        {
            get
            {
                return dataGridView;
            }
            set
            {
                dataGridView = value;
            }
        }
 
        // Implements the IDataGridViewEditingControl.EditingControlValueChanged property.
        public bool EditingControlValueChanged
        {
            get
            {
                return valueChanged;
            }
            set
            {
                valueChanged = value;
            }
        }
 
        // Implements the IDataGridViewEditingControl.EditingPanelCursor property.
        public Cursor EditingPanelCursor
        {
            get
            {
                return base.Cursor;
            }
        }
 
        protected override void OnValueChanged(EventArgs eventargs)
        {
            // Notify the DataGridView that the contents of the cell have changed.
            valueChanged = true;
            this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
            base.OnValueChanged(eventargs);
        }
    }
Если я в новом проекте создаю окно и пишу там вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public partial class Form1 : Form
    {
        private DataGridView dataGridView1 = new DataGridView();
 
        public Form1()
        {
            this.dataGridView1.Dock = DockStyle.Fill;
            this.Controls.Add(this.dataGridView1);
            this.Load += new EventHandler(Form1_Load);
            this.Text = "DataGridView calendar column demo";
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            CalendarColumn col = new CalendarColumn();
            this.dataGridView1.Columns.Add(col);
            this.dataGridView1.RowCount = 5;
            foreach (DataGridViewRow row in this.dataGridView1.Rows)
            {
                row.Cells[0].Value = DateTime.Now;
            }
        }
    }
то все работает.

А вот если в своем пишу коде, при этом DataGridView у меня есть, и пишу вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public partial class Form1 : Form
    {
        //--------------------------------------------------------------------------------------------
        // Инициализация формы
        //--------------------------------------------------------------------------------------------
        public Form1()
        {
            InitializeComponent();
 
            CalendarColumn col = new CalendarColumn();
            this.dataGridView1.Columns.Add(col);
        }
...
то при открытии Form1.cs у меня вылетает вот такая ошибка:
The service System.Windows.Forms.Design.ISelectionUI Service already exists in the service container. Parameter name: serviceType

И дизайн формы я естественно не вижу. Так же программа не компилируется и пишет вот такую ошибку:
An unhandled exception of type 'System.Resources.MissingManifestResourc eException' occurred in mscorlib.dll

Additional information: Не удалось найти ресурсы, соответствующие указанной культуре или нейтральной культуре. Проверьте правильность внедрения или связывания "PTRC3.Form1.resources" со сборкой "PTRC3" во время компиляции, или убедитесь, что все необходимые сопутствующие сборки полностью подписаны и могут быть загружены.

В чем может проблема? Ребят в C# я нуб, знаю только C++, но проект нужно быстро сделать, а на C++ дольше получится, так что выбрал C#
0
6 / 6 / 1
Регистрация: 20.02.2015
Сообщений: 114
10.02.2016, 17:59
хз. Только что создал новый проект. Кинул на форму датагридвью. Скопировал туда пример с мсдн и то что вы пишите у себя в проекте. Все работает. Может мусор какой остался в Form.Designer.cs. А что студия ссылку на ошибку не дает? или я что то не понял..
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
10.02.2016, 18:06  [ТС]
Выдает. Пишет ошибку на вот эту строку:
this.Icon = ((System.Drawing.Icon)(resources.GetObje ct("$this.Icon")));

в файле Form1.Designer.cs
0
6 / 6 / 1
Регистрация: 20.02.2015
Сообщений: 114
10.02.2016, 22:12
Тут на забугорном сайте рекомендуют удалить папки obj и bin из проекта (предварительно нужно выйти из студии), отрыть проект и заново скомпилить. Ну может не удалять а переименовать на всякий случай.
1
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
14.02.2016, 00:27  [ТС]
Все спасибо! Все заработало)
0
6 / 6 / 1
Регистрация: 20.02.2015
Сообщений: 114
14.02.2016, 20:47
Удалил и заработало? или как? ну это для других на будущее
0
Каждому свое
 Аватар для Bretbas
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
15.02.2016, 22:53  [ТС]
Перезагрузил VS
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.02.2016, 22:53
Помогаю со студенческими работами здесь

Сделать только одну ячейку в DataGridView доступной для редактирования
на форме есть Datagridview2.Columns(1).ReadOnly = True как мне разрешить редактирование только одной ячейки с адресом (4...

Допускать ввод в EDIT только даты
Привет ребята! Есть форма и на ней один едит. Вопрос: Как сделать так, чтобы пользователь вводил дату, а не бред собачий? Нужно что-то...

Ввод даты не только числами, но и словами (названия месяцев)
В общем у меня 2 запроса с параметром в которые вводится определённая дата. Мне нужно сделать так что бы я мог вводить дату не толко...

DataGridView и ввод только цифр
Нужно ввести в стобец DataGridView IP адреs. Т.е. разрешить ввод только цифр от 0 д 255 и 2 точки. Написала так, но DataGridView не...

DataGridView, ввод только цифр
Здравствуйте, имеется DataGridView, который создается динамически, размеры ячеек, размеры таблицы, положение их и прочее редактируются...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru