Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
2 / 2 / 0
Регистрация: 09.10.2009
Сообщений: 40

datagridview. в ячейке выбор нужной формы

11.11.2009, 11:01. Показов 3922. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
datagridview. в ячейке выбор нужной формы, с выбором нужной записи.
я так понимаю есть тип колонок - datagridcomboboxcolumn. мне нужно чтобы можно было выбрать из другой таблицы значение и записать в datagrid значение и представление. но суть в том что стандартно (насколько я понял) datagridcomboboxcolumn не открывает произвольную форму, а открывает таблицу с записями. я бы хотел открыть произвольную форму с нужной таблицей. если событие afterselect или что еще нужное, как лучше реализовать мою задачу?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.11.2009, 11:01
Ответы с готовыми решениями:

Выбор строки dataGridView из textbox другой формы
private void textBox5_TextChanged(object sender, EventArgs e) { if (dataGridView1.DataSource ==...

Удаление строки из DataGridView: удаляется строка находящееся выше нужной
Все привет!!!! Из DataGridView плдключенном к Access удаляю строку вот этим способом. private void DeleteItem() { ...

Менять цвет в dataGridView нужной строчки при выполненном условии
Доброго Времени суток! :handshake: Как можно менять цвет в dataGridView определенной строчки если условие совпадает пытался сделать...

16
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
11.11.2009, 14:02
Не особо понятно..
Вам нужно, по клику на ячейке, открыть другую форму, из которой выбранное значение подставиться в эту ячейку? И причем здесь ячейка типа комбобокса?
0
2 / 2 / 0
Регистрация: 09.10.2009
Сообщений: 40
11.11.2009, 16:44  [ТС]
да именно так. но мне кроме того нужно чтобы была кнопочка типа как в комбобоксе в виде дельты греческой перевернутой (или треугольник с вершиной внизу). я привел в качестве примера его, т.к. не подобное еще может решить текстбокс, но он для ввода текста.

Добавлено через 1 минуту
не просто по клику на ячейке, а по нажатии этой кнопочки когда ячейка уже в режиме редактирования. аналог комбобокса, только он открывает не форму а список

Добавлено через 10 минут
Цитата Сообщение от Green Посмотреть сообщение
Не особо понятно..
Вам нужно, по клику на ячейке, открыть другую форму, из которой выбранное значение подставиться в эту ячейку? И причем здесь ячейка типа комбобокса?
ау, что скажете?
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
12.11.2009, 05:25
Необходимо написать три класса.
Один, наследник от DataGridViewTextBoxCell - для ячейки.
Второй, наследник DataGridViewTextBoxColumn - для столбца таких ячеек.
Третий, реализует интерфейс IDataGridViewEditingControl. Он будет вызывать форму и передавать значение в ячейку.

Добавлено через 54 секунды
Цитата Сообщение от Кувалда Посмотреть сообщение
ау, что скажете?
Не кричите, не в лесу.
0
2 / 2 / 0
Регистрация: 09.10.2009
Сообщений: 40
14.11.2009, 15:57  [ТС]
Я так понимаю еще нужно пользовательский элемент управления включающий textbox и кнопку рядом по нажатию открывающая форму с datagrid. Пользовательский элемент вроде создал. дальше взял пример известный про datetimepiker. а вот дальше дело не идет. не поделитесь реализацией, или ссылкой где мою задачу можно посмотреть решенной? я думаю что это частая задача, даже непонятно как можно строить базу данных на основе combobox, это неудобно. должны быть реализации уже готовые, новичку сложно в этом разобраться.
0
2 / 2 / 0
Регистрация: 09.10.2009
Сообщений: 40
14.11.2009, 23:41  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
Необходимо написать три класса.
Один, наследник от DataGridViewTextBoxCell - для ячейки.
Второй, наследник DataGridViewTextBoxColumn - для столбца таких ячеек.
Третий, реализует интерфейс IDataGridViewEditingControl. Он будет вызывать форму и передавать значение в ячейку.

Добавлено через 54 секунды

Не кричите, не в лесу.

казалось бы такое действие должно быть реализовано в windows form стандартно. потому как менять данные с помощью comboboxcolumn неудобно, да и говоря откровенно просто смешно. в общем я создал польз. элемент управления и прописал его как datagrideditingcontrol. в итоге при входе в редактирование ячейки у польз. элемента управления ширина не соответствует ширине колонки datagrid. В общем главный вопрос: почему так сложно, можно ли проще, если нет то как сделать ширину данного польз. элемента равной ширине колонки, которую могут еще менять.
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
15.11.2009, 15:02
Цитата Сообщение от Кувалда Посмотреть сообщение
я думаю что это частая задача, даже непонятно как можно строить базу данных на основе combobox, это неудобно. должны быть реализации уже готовые, новичку сложно в этом разобраться.
Базы данных не строят на основе элементов управления. Контролы нужны для отображения и управления данными.

Цитата Сообщение от Кувалда Посмотреть сообщение
казалось бы такое действие должно быть реализовано в windows form стандартно
Это вам так кажется.

Цитата Сообщение от Кувалда Посмотреть сообщение
потому как менять данные с помощью comboboxcolumn неудобно, да и говоря откровенно просто смешно
Вы сами выбрали комбобокс. Если хотели его использовать не для выбора значения из списка, то это ваш промах.

Цитата Сообщение от Кувалда Посмотреть сообщение
в итоге при входе в редактирование ячейки у польз. элемента управления ширина не соответствует ширине колонки datagrid.
Ошибка в коде. Если нужна помошь, тогда показывайте код, указывайте как и что не работает.

Не по теме:


Цитата Сообщение от Кувалда Посмотреть сообщение
В общем главный вопрос: почему так сложно, можно ли проще, если нет то как сделать ширину данного польз. элемента равной ширине колонки, которую могут еще менять.
В начале всегда сложно. Ходить тоже не сразу начинают. :)

0
2 / 2 / 0
Регистрация: 09.10.2009
Сообщений: 40
15.11.2009, 15:24  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
Базы данных не строят на основе элементов управления. Контролы нужны для отображения и управления данными.

Это вам так кажется.

Вы сами выбрали комбобокс. Если хотели его использовать не для выбора значения из списка, то это ваш промах.

Ошибка в коде. Если нужна помошь, тогда показывайте код, указывайте как и что не работает.

Не по теме:



В начале всегда сложно. Ходить тоже не сразу начинают. :)

Что можно использовать еще для редактирования данных из новой открывающейся формы? Я вот пытаюсь найти, но ничего другого ближе чем combobox не нашел, понятно что это не то, и он открывает список а не форму! Поэтому и стал писать польз. элемент.

Вот код:
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
CalendarColumn col = new CalendarColumn();
dataGridView1.Columns.Add(col);
//-----------------------------------------
    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"; sus
        }
 
        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;
            ctl.ValueSt = (string)this.Value;
        }
 
        public override Type EditType
        {
            get
            {
                // Return the type of the editing contol that CalendarCell uses.
                return typeof(CalendarEditingControl);
            }
        }
 
        public override Type ValueType
        {
            get
            {
                // Return the type of the value that CalendarCell contains.
                return typeof(string);
            }
        }
 
        public override object DefaultNewRowValue
        {
            get
            {
                // Use the current date and time as the default value.
                return "да"; // DateTime.Now;
            }
        }
    }
 
    class CalendarEditingControl : TexBoxSV, 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.ValueSt; //.ToShortDateString();
            }
            set
            {
                if (value is String)
                {
                    this.ValueSt = (String)value;
                    //this.Value = DateTime.Parse((String)value);
                }
            }
        }
 
        // 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);
        //}
    }
 
//-----------------------------------
//далее код созданного пользовательского элемента управления, состоящего из textbox и кнопки, по нажатию на которую будет открываться форма.
    public partial class TexBoxSV : UserControl
    {
        public TexBoxSV()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            //System.Console("ура");
        }
        public string ValueSt
        {
            get { return textBox1.Text; }
            set {
                //base.CellTemplate = value; 
            }
        }
    }
Добавлено через 2 минуты
не обращайте внимание на имена "Calendar", это не календарь, это текстовое поле с кнопкой, просто я взял пример с msdn про поле Calendar в datagrid
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
15.11.2009, 16:56
Проблема с размером решается выставлением правильной привязки у TextBox и Button в контроле TexBoxSV. По экпериментируйте со свойстом Anchor.
0
2 / 2 / 0
Регистрация: 09.10.2009
Сообщений: 40
15.11.2009, 17:12  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
Проблема с размером решается выставлением правильной привязки у TextBox и Button в контроле TexBoxSV. По экпериментируйте со свойстом Anchor.
Брависсимо!!! Помогло вроде. Спасибо. Буду дальше копать - делать обработчик кнопки, вызов нужной формы. Но вообще я на правильном пути? Что-то все сложно как-то. И я перелопатил кучу ссылок в инете - такое впечатление что никто такое не делал.
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
15.11.2009, 17:20
Цитата Сообщение от Кувалда Посмотреть сообщение
Но вообще я на правильном пути? Что-то все сложно как-то. И я перелопатил кучу ссылок в инете - такое впечатление что никто такое не делал.
Вам осталось пару штрихов. Это стандартный путь предлагаемый фреймворком для расширения функционала DataGridView.
0
2 / 2 / 0
Регистрация: 09.10.2009
Сообщений: 40
17.11.2009, 22:12  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
Проблема с размером решается выставлением правильной привязки у TextBox и Button в контроле TexBoxSV. По экпериментируйте со свойстом Anchor.
Вот дальше делаю, но есть вопросы еще:
1. Почему-то при вводе в мой TexBoxSV при выходе из редактирования из ячейки текст не выводится.
2. Чтобы записывать в поле таблицы базы данных ссылку на запись другой таблицы, а в ячейке для пользователя выводить представление (не номер же записи, а например название контрагента) нужно в datagridview создавать две колонки? - одну для кода записи, одну для пользовательского представления?
3. Как из открытой мною формы передать обратно в ячейку datagrid код и польз. представление той записи что выбрал пользователь?
4. Если ли какая-то литература на русском по datagrid, где подробно описаны подобные моменты? У меня есть две книги по visual studio, но в них тупо упор идет на привязку к таблицам и т.п. Есть Петцольда книга.

Добавлено через 1 минуту
к пункту два, т.е. есть ли в ячейках свойства value и text как у некоторых других элементов управления, или что-то подобное?
0
2 / 2 / 0
Регистрация: 09.10.2009
Сообщений: 40
21.11.2009, 20:29  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
Вам осталось пару штрихов. Это стандартный путь предлагаемый фреймворком для расширения функционала DataGridView.
вопрос №1 решил своими силами, все просто было до безобразия.
0
2 / 2 / 0
Регистрация: 09.10.2009
Сообщений: 40
30.11.2009, 22:32  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
Вам осталось пару штрихов. Это стандартный путь предлагаемый фреймворком для расширения функционала DataGridView.
Есть еще такой вопрос. можно ли в гриде выводить колонку одну под другой? не объединение, а одна под другой, чтобы два поля в одной колонке выводились, но при этом принадлежали одной строке? Я видел вашу ветку где обрабатывает отрисовка ячеек, но это для объдинения, и то я сомневаюсь что текст будет выведен посередине обеих ячеек (мне это не нужно, к слову написал).
Что делать если нужно что типа excel для формирования отчетов?
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
01.12.2009, 02:26
Цитата Сообщение от Кувалда Посмотреть сообщение
Есть еще такой вопрос. можно ли в гриде выводить колонку одну под другой?
Можно решить отрисовкой, но не бордюра, а полной отрисовкой ячейки. Но по сути это будет все равно один столбец. DataGridView не настолько мощный инструмент, чтобы создавать таблицы как в Word'е.
0
2 / 2 / 0
Регистрация: 09.10.2009
Сообщений: 40
01.12.2009, 10:57  [ТС]
Цитата Сообщение от Green Посмотреть сообщение
Можно решить отрисовкой, но не бордюра, а полной отрисовкой ячейки. Но по сути это будет все равно один столбец. DataGridView не настолько мощный инструмент, чтобы создавать таблицы как в Word'е.
а что посоветуете в моем случае? есть ли открытые решения для этого, насколько сложно самому грид написать нужный? может в 2010 студии это будет?
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
02.12.2009, 02:30
Цитата Сообщение от Кувалда Посмотреть сообщение
а что посоветуете в моем случае? есть ли открытые решения для этого, насколько сложно самому грид написать нужный? может в 2010 студии это будет?
Один вопрос - одна тема.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.12.2009, 02:30
Помогаю со студенческими работами здесь

Запуск нужной формы ?
Здравствуйте ! Подскажите пожалуйста как сделать чтобы первым запустилась Form2 а не Form1 в Visual Studio 2010. Заранее спасибо!

Рисуем в ячейке datagridview
Добрый день. Возник такой вопрос. Нужно, чтобы кликнув по ячейке DataGridView в ней появился рисунок. Рисунок вроде появляется, но...

Количество символов в ячейке DataGridView
Ребят, нужна помощь, бо горит уже.. ------------------------------------------ Можно ли прописать кодом количество символов в ячейке...

Автоперенос текста в ячейке DataGridView
В базе хранятся записи разной длины нужно сделать чтоб, если текст не помещается в ячейку, сделать ячейку в две строки и т. д. ? размер...

Отображение данных в ячейке DataGridView
Как сделать, чтоб при вводе любых данных в ячейку оно подставляла "КГ" после цифры, которую я ввёл?


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru