powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / datagridview и формат значений колонок (только число)
13 сообщений из 13, страница 1 из 1
datagridview и формат значений колонок (только число)
    #38451603
stim24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо сделать чтобы в datagrid в определенные колонки пользователь
мог вводить либо только число либо дату.
Нашел статейку на msdn
http://msdn.microsoft.com/ru-ru/library/7tas5c80.aspx

Сделал класс для даты все нормально работает и удобно(даже сказал бы классно).
Решил также сделать для чисел. сделал все тоже самое.
конечно в гриде теперь появляется NumericUpDown но сохраняет введенное число со 2-го раза. подскажите почему и что я не так делаю?

Код: 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.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CControlLibrary.ColumnsClass
{
    public class ColumnDecimal : DataGridViewColumn
    {
        public ColumnDecimal()
            : base(new ColumnDecimalCell())
        {
        }

        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(ColumnDecimalCell)))
                {
                    throw new InvalidCastException("Must be a ColumnDecimalCell");
                }
                base.CellTemplate = value;
            }
        }
    }

    public class ColumnDecimalCell : DataGridViewTextBoxCell
    {

        public ColumnDecimalCell()
            : base()
        {
            // Use the format.
            this.Style.Format = "N2";
        }

        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);
            ColumnDecimalEditingControl ctl = DataGridView.EditingControl as ColumnDecimalEditingControl;
            // Use the default row value when Value property is null.
            if (this.Value == null)
            {
                ctl.Value = (decimal)this.DefaultNewRowValue;
            }
            else
            {
                ctl.Value = (decimal)this.Value;
            }
        }

        public override Type EditType
        {
            get
            {
                // Return the type of the editing control that CalendarCell uses.
                return typeof(ColumnDecimalEditingControl);
            }
        }

        public override Type ValueType
        {
            get
            {
                // Return the type of the value that CalendarCell contains.

                return typeof(decimal);
            }
        }

        public override object DefaultNewRowValue
        {
            get
            {
                // Use the current date and time as the default value.
                return (decimal)0.00;
            }
        }
    }

    class ColumnDecimalEditingControl : NumericUpDown, IDataGridViewEditingControl
    {
        DataGridView dataGridView;
        private bool valueChanged = false;
        int rowIndex;

        public ColumnDecimalEditingControl()
        {
            this.Maximum = (decimal)999999999999999999.99;
            this.Minimum = (decimal)-999999999999999999.99;
            //this.DecimalPlaces = 2;
            this.Enter += new System.EventHandler(this.Enter1);
        }


        public void Enter1(object sender, EventArgs e)
        {
          //  this.Select(0, this.Value.ToString().Length);
        }


        // Implements the IDataGridViewEditingControl.EditingControlFormattedValue 
        // property.
        public object EditingControlFormattedValue
        {
            get
            {
                if (this.Text == "")
                {
                    this.Value = 0;
                }
                return this.Value.ToString();
            }
            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 = Decimal.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 = (decimal)0.00;
                    }
                }
            }
        }

        // 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;
        }

        // 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);
        }
    }
}
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38453902
stim24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
up
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38453920
фиганыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stim24,

честно - тупо лень выискивать в коде багу - в архиве рабочая колонка CalendarEdit - посмотри как там и найди багу сам.
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38454075
stim24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В календарем проблем как раз нету.
А есть класс для NumericUpDown ?
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38456038
фиганыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stim24,

чё-то даже не лень мне было переделать из календаря в нумерикапдаун - проблем вроде нету
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38457472
stim24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так же работает "коряво" у тебя один в один!!!
Смотри ты установил класс в грид.
Теперь ходим курсом (клавиатурой) на данную колонку ячейку в колонке(numeric). Ячейка вся выделена.
и набирай 1,2
цифра 1 не попадает в numericup
цифра 2 попадает в numericup
нажимаешь enter
и даже 2-ка не встала в грид.

если на этой же ячейки опять повторить операцию то 1 опять не попадет а 2-ка уже сохраниться.

ни как победить не могу
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38457820
фиганыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stim24Так же работает "коряво" у тебя один в один!!!
Смотри ты установил класс в грид.
Теперь ходим курсом (клавиатурой) на данную колонку ячейку в колонке(numeric). Ячейка вся выделена.
и набирай 1,2
цифра 1 не попадает в numericup
цифра 2 попадает в numericup
нажимаешь enter
и даже 2-ка не встала в грид.

если на этой же ячейки опять повторить операцию то 1 опять не попадет а 2-ка уже сохраниться.

ни как победить не могу
ну вот - теперь понятно, что ты имел ввиду создавая тему
дебагер в помощь дал решение, замени в моём классе NumericEdit:
Код: 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.
public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
        {
            switch (keyData & Keys.KeyCode)
            {
                case Keys.Down:
                case Keys.Right:
                case Keys.Left:
                case Keys.Up:
                case Keys.Home:
                case Keys.End:
                    OnValueChanged();
                    return true;
                case Keys.NumPad0:
                case Keys.NumPad1:
                case Keys.NumPad2:
                case Keys.NumPad3:
                case Keys.NumPad4:
                case Keys.NumPad5:
                case Keys.NumPad6:
                case Keys.NumPad7:
                case Keys.NumPad8:
                case Keys.NumPad9:
                    numericUpDown1.Value = Convert.ToInt32((keyData-Keys.NumPad0).ToString()+ numericUpDown1.Value.ToString());
                    return false;
                default:
                    OnValueChanged();
                    return false;
            }
        }



тупо - но работает, с ошибкой максимального значения - уже сам управишься.
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38457825
фиганыч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stim24,

да и работает только когда на нумпаде цифры набираешь :) - это так к слову.
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38461315
stim24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Также не верно работает. потом по две цифры вставляет.
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38462537
Sergey S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ячейка должна сначала перейти в режим редактирования, если не ошибаюсь, при первом нажатии это как раз и происходит, потом уже нажатые кнопки попадают в ячейку.
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38470755
stim24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно можно конечно научить пользователя чтобы он в начале входил в редактирование ячейки,
а потом набирал данные.
Заметил закономерность в гриде запрещено пользователю добавлять строки. и почему-то на последней строке
не срабатывает введенное значение только со второго раза вводит.
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38470763
stim24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да данная вся проблема на последней строчки грида
...
Рейтинг: 0 / 0
datagridview и формат значений колонок (только число)
    #38504507
stim24
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может кто помочь? Проблема в последней строке! в нее не с первого раза встают значения.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / datagridview и формат значений колонок (только число)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]