5

Quiero tener un DataGridView que tenga dos columnas. La primera columna siempre será del tipo DataGridViewComboBoxColumn. De acuerdo con la selección en esa columna, me gustaría poder cambiar la celda correspondiente en la segunda columna a DataGridViewComboBoxCell o DataGridViewTextBoxCell.¿Cómo cambiar entre DataGridViewTextBoxCell y DataGridViewComboBoxCell?

Estoy pensando que solo necesito hacer la segunda columna de tipo DataGridViewColumn, pero no entiendo la mecánica de cómo cambiar el tipo de celda sobre la marcha.

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 se parece bastante a un cuadro de texto que podría vivir con él, y no implicaría cambiar el tipo de la celda.

Respuesta

3

No tengo la versión VB.Net, pero espero que este fragmento rápido de C# lo ayude o lo guíe en la dirección correcta.

En este ejemplo, configuré un DataGridView simple con 2 columnas. El primero es un DataGridViewComboBox poblado con dos opciones: "Texto" o "Combo".

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

Manejo el evento CurrentCellDirtyStateChanged en DataGridView. Compruebo si la celda está sucia y solo reviso la primera columna (The ComboBox). Debes llamar al CommitEdit para obtener el nuevo valor en el combo o de lo contrario estarás viendo el valor anterior. En función de la selección en el cuadro combinado, sobrescribo la celda en la segunda columna con una nueva celda de ese tipo.

Agregaría su propia lógica (rellene los menús desplegables y maneje 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(); 
      } 
     } 
    } 

Aquí 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

+0

Gracias. Esto es útil. No soy realmente un VB o un.NET experto, así que veo lo que estás haciendo en principio, pero la mecánica de asignar un nuevo DataGridViewTextBoxCell o un nuevo DataGridViewComboBoxCell en VB es algo que todavía tendré que resolver. En cualquier caso, agradezco el tiempo que le dedicas a tu respuesta, y lo intentaré esta tarde. – John

+0

Funciona muy bien. ¡Gracias! – John

2

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

This sample crea una celda de botón de opción, no es difícil cambiar el código para alojar un control de usuario.

0
dgvCell = new DataGridViewTextBoxCell();   // code to remove checkbox 
     dgvCell.Value = string.Empty; 
     dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell; 
Cuestiones relacionadas