Добавление элемента управления datagridview различных типов клеток в столбце
Цель
Мой datagridview имеет два столбца ([Вопрос], [Ответ]). В зависимости от известного типа вопроса (Да/нет флажок, текст текстовое поле, загрузка файлов кнопка ) я хочу, чтобы ячейка столбца имела соответствующийэлемент управления .
Пример
Строки Datagridview:
- [Вопрос] Как сколько тебе лет? [Ответ] (Текст Textbox )
- [Вопрос] загрузка документа [ответ] (загрузка файла кнопка )
[33]} [Вопрос] Вы курите? [Ответ] (YesNo Флажок )
Работа
Я программно создаю свои datagridviews.
Private Sub FormatQuestionDgv(ByVal dgv As DataGridView)
Dim ColQ As New DataGridViewTextBoxColumn
Dim ColA As New DataGridViewColumn
'Header text
ColQ.HeaderText = "Question"
ColA.HeaderText = "Answer"
'Name
ColQ.Name = "ColQ"
ColA.Name = "ColA"
'Widths
ColQ.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
ColA.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
'Add columns
With dgv.Columns
.Add(ColQ)
.Add(ColA)
End With
End Sub
Задача
Как вы можете видеть в моей работе, столбец ответов имеет тип
DataGridViewColumn. В тот момент я не знал, что это за вопрос. Поэтому я объявляю его как обычный столбец, а не DataGridViewCheckBoxColumn, DataGridViewTextBoxColumn, DataGridViewButtonColumn... Так как это не такой же тип, как DataGridViewColumn, я получаю следующую ошибку:

Как добавить различные типы элементов управления в 1 столбец DataGridViewColumn? Возможно ли это вообще?
3 ответов:
Вы смотрели на это:
Смешивание типов ячеек в столбце DataGridViewColumn
Ячейки DataGridview одного столбца не могут иметь другой тип
Следует из статьи MSDN...
Есть два способа сделать это:
- приведите
DataGridViewCellк определенному типу ячеек, который существует. Для например, преобразоватьDataGridViewTextBoxCellвDataGridViewComboBoxCellтип.- создайте элемент управления и добавьте его в коллекцию элементов управления
DataGridView, Установите его местоположение и размер, чтобы соответствовать ячейке, которая будет хозяин.Вот пример кода, который иллюстрирует эти трюки:
private void Form5_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add("name"); for (int j = 0; j < 10; j++) { dt.Rows.Add(""); } this.dataGridView1.DataSource = dt; this.dataGridView1.Columns[0].Width = 200; /* * First method : Convert to an existed cell type such ComboBox cell,etc */ DataGridViewComboBoxCell ComboBoxCell = new DataGridViewComboBoxCell(); ComboBoxCell.Items.AddRange(new string[] { "aaa","bbb","ccc" }); this.dataGridView1[0, 0] = ComboBoxCell; this.dataGridView1[0, 0].Value = "bbb"; DataGridViewTextBoxCell TextBoxCell = new DataGridViewTextBoxCell(); this.dataGridView1[0, 1] = TextBoxCell; this.dataGridView1[0, 1].Value = "some text"; DataGridViewCheckBoxCell CheckBoxCell = new DataGridViewCheckBoxCell(); CheckBoxCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter; this.dataGridView1[0, 2] = CheckBoxCell; this.dataGridView1[0, 2].Value = true; /* * Second method : Add control to the host in the cell */ DateTimePicker dtp = new DateTimePicker(); dtp.Value = DateTime.Now.AddDays(-10); //add DateTimePicker into the control collection of the DataGridView this.dataGridView1.Controls.Add(dtp); //set its location and size to fit the cell dtp.Location = this.dataGridView1.GetCellDisplayRectangle(0, 3,true).Location; dtp.Size = this.dataGridView1.GetCellDisplayRectangle(0, 3,true).Size; }
Другие ответы-путь к трудному и склонному к ошибкам. Почему бы и нет? добавить нужную строку программно?
Пример:
Используя конструктор, создайте форму с DataGridView и двумя столбцами: один для вопроса и один для ответа.
private DataGridView dataGridView3; private DataGridViewTextBoxColumn columnQuestion; private DataGridViewTextBoxColumn columnAnswer;В своем классе я создал перечисление для типа ответа
public enum AnswerType { Text, YesNo, LoadFile, Combo, };Метод создания ячейки вопроса прост
private DataGridViewCell CreateQuestionCell(string question) { return new DataGridViewTextBoxCell() { ValueType = typeof(string), Value = question, }; }Метод создания ячейки ответа имеет параметр указание желаемого типа ответа:
private DataGridViewCell CreateAnswerCell(AnswerType answerType) { // type of column depends on rowIndex DataGridViewCell cell; switch (answerType) { case AnswerType.YesNo: // Create a checkbox cell cell = new DataGridViewCheckBoxCell() { ValueType = typeof(bool), Value = false, }; break; case AnswerType.LoadFile: // Create a Button cell cell = new DataGridViewButtonCell() { ValueType = typeof(string), Value = "Load!", }; break; case AnswerType.Combo: // Create a Combo Cell var selectableValues = Enumerable.Range(0, 4); var comboItems = Enumerable.Range(0, 100); cell = new DataGridViewComboBoxCell() { DataSource = new BindingList<int>(comboItems.ToList()), }; break; default: // Create a Text cell cell = new DataGridViewTextBoxCell() { ValueType = typeof(string), Value = "<please enter name>", }; break; } return cell; }По запросу добавьте строку, содержащую ячейку вопроса и ячейку ответа:
private void AddRow(string question, AnswerType answerType) { DataGridViewRow row = new DataGridViewRow(); row.Cells.Add(this.CreateQuestionCell(question)); row.Cells.Add(this.CreateAnswerCell(answerType)); row.Cells[columnQuestion.Index].ReadOnly = true; this.dataGridView3.Rows.Add(row); }Для тестирования я создал четыре кнопки и обработчики для добавления строк:
private Button buttonCheckbox; private Button buttonAction; private Button buttonCombo; private Button buttonText; private void OnButtonCheckbox(object sender, EventArgs e) { this.AddRow("Do you smoke", AnswerType.YesNo); } private void OnButtonText(object sender, EventArgs e) { this.AddRow("Name", AnswerType.Text); } private void OnButtonCombo(object sender, EventArgs e) { this.AddRow("Age?", AnswerType.Combo); } private void OnButtonAction(object sender, EventArgs e) { this.AddRow("Document upload", AnswerType.LoadFile); }Et voilà, ça marche! Просто comme bonjour!
DataGridViewCellStyle styl_Column = new DataGridViewCellStyle(); if (_myColumnCollection[i].TypeColumn == TypColumn.CheckBox) { dtv_information.Columns.Add(chk_clmn); styl_Column.NullValue = false; } styl_Column.NullValue = false;
Comments