Добавление элемента управления datagridview различных типов клеток в столбце



Цель



Мой datagridview имеет два столбца ([Вопрос], [Ответ]). В зависимости от известного типа вопроса (Да/нет флажок, текст текстовое поле, загрузка файлов кнопка ) я хочу, чтобы ячейка столбца имела соответствующийэлемент управления .



Пример



Строки Datagridview:




    [33]} [Вопрос] Вы курите? [Ответ] (YesNo Флажок )
  1. [Вопрос] Как сколько тебе лет? [Ответ] (Текст Textbox )

  2. [Вопрос] загрузка документа [ответ] (загрузка файла кнопка )




Работа



Я программно создаю свои 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? Возможно ли это вообще?

671   3  

3 ответов:

Вы смотрели на это:

Смешивание типов ячеек в столбце DataGridViewColumn

Ячейки DataGridview одного столбца не могут иметь другой тип

Http://social.msdn.microsoft.com/Forums/windows/en-US/148b232b-ce8c-4c49-b35d-50d8a5c448d1/different-cell-types-in-a-datagridview-column

Следует из статьи MSDN...

Есть два способа сделать это:
  1. приведите DataGridViewCell к определенному типу ячеек, который существует. Для например, преобразовать DataGridViewTextBoxCell в DataGridViewComboBoxCell тип.
  2. создайте элемент управления и добавьте его в коллекцию элементов управления 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

    Ничего не найдено.