Pregunta

Quiero tener un DataGridView que tiene dos columnas. La primera columna siempre será de tipo DataGridViewComboBoxColumn. Sobre la base de la selección en esa columna, me gustaría ser capaz de cambiar la celda correspondiente en la segunda columna ya sea a un DataGridViewComboBoxCell o una DataGridViewTextBoxCell.

Estoy pensando que sólo hay que hacer la segunda columna de tipo DataGridViewColumn, pero no entender la mecánica de cómo cambiar el tipo de célula en el momento.

Estoy trabajando con VB.NET en Visual Studio 2005.

Gracias de antemano!

Actualización: Una forma de evitar que, supongo, es hacer que la segunda columna como un DataGridViewComboBoxColumn, y cambiar los atributos de la celda para que sea comporta como una lista desplegable, o como un (editable) desplegable sin elementos. Este último parece lo suficientemente como un cuadro de texto que podría vivir con ella, y no implicaría cambiar el tipo de la célula.

¿Fue útil?

Solución

No tengo la versión VB.Net, pero esperemos que esto rápido fragmento C # te ayudaré o señalarle en la dirección correcta.

En este ejemplo, puedo tener un DataGridView sencillo con 2 columnas. Siendo la primera una DataGridViewComboBox rellena con dos opciones:. "Texto" o "Combo"

La segunda columna se establece inicialmente en DataGridViewTextBoxColumn del diseñador.

Me controlar el evento CurrentCellDirtyStateChanged en el DataGridView. Puedo comprobar si la celda está sucia y sólo comprobar la primera columna (El ComboBox). Tienes que llamar a la CommitEdit para obtener el nuevo valor en el combo o de lo contrario se le busca en el valor anterior. Sobre la base de la selección en el cuadro combinado entonces sobrescribir la celda de la segunda columna con una nueva célula de ese tipo.

Se podría añadir su propia lógica (poblar las llanuras de la gota y manejar el valor). Es posible que desee almacenar el valor y luego ponerlo de nuevo en la celda o lo que sea.

Aquí está el código que utilicé y de hacer una prueba rápida y sucia en:

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (dataGridView1.IsCurrentCellDirty == false)
        {
            return;
        }

        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);

        if (dataGridView1.CurrentCell.ColumnIndex == 0)
        {               
            if (((string)dataGridView1.CurrentCell.Value) == "Text")
            {
                dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewTextBoxCell();
            }
            else if (((string)dataGridView1.CurrentCell.Value) == "Combo")
            {
                dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewComboBoxCell();
            }
        }
    }

A continuación es una traducción rápida VB, que he probado y funciona.

Public Class Form1

Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged

    If DataGridView1.IsCurrentCellDirty = False Then
        Return
    End If

    DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)

    If DataGridView1.CurrentCell.ColumnIndex = 0 Then

        If CStr(DataGridView1.CurrentCell.Value) = "Text" Then
            DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewTextBoxCell

        ElseIf CStr(DataGridView1.CurrentCell.Value) = "Combo" Then
            DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewComboBoxCell
        End If

    End If


End Sub

End Class

Usted perderá cualquier valor almacenado en esa columna, por lo que tendría que guardarlo primero.

Jon

Otros consejos

Usted puede crear su propia plantilla de la célula que aloja un control de usuario. En el control de usuario se agrega un cuadro de texto y un cuadro combinado, y agregar un método / propiedad para mostrar y ocultar uno otro.

Esta muestra crea un botón de opción célula, no es difícil de cambiar el código de acoger un control de usuario.

dgvCell = new DataGridViewTextBoxCell();         // code to remove checkbox
        dgvCell.Value = string.Empty;
        dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top