2011-10-27 153 views
8

¿Hay alguna forma de agregar un control (por ejemplo, un botón) a una celda Winforms DataGridView en C#?Agregar un botón a Winforms DataGridView

(Lo que yo estoy apuntando es poner varios tipos de controles en diferentes celdas de la rejilla ...)

+0

http://stackoverflow.com/questions/6085930/add-button-column-in-a-databound-datagridview –

Respuesta

6

se puede hacer como esto ....

No tenemos dos maneras de hacer esto:

  • 1). Emite un DataGridViewCell a un cierto tipo de celda que existe. Para el ejemplo , convierta un DataGridViewTextBoxCell al tipo DataGridViewComboBoxCell.
  • 2). Cree un control y agréguelo a la colección de controles DataGridView, establezca su ubicación y tamaño para que se ajuste a la celda que será el host .

Vea mi código de ejemplo a continuación que ilustra los trucos.

Fragmento de código

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; 
    } 
+1

Mientras que el segundo método muestra el control, permanece estático cuando las celdas se desplazan. ¿Hay alguna forma de bloquear el nuevo control en la celda subyacente? – CrazyHorse

+0

El primer método funcionó bien, el segundo hace que el control se "caiga" de la cuadrícula cuando se desplaza. Supongo que podrías usar el evento de formato para volver a moverlo. –

6

El DataGridViewButtonColumn es un tipo de columna, siempre que contiene un botón que se pulse. Usted puede agregar sus propios controles a las células:

http://msdn.microsoft.com/en-us/library/7tas5c80.aspx

Tenga en cuenta que no siempre es trivial, pero he visto que alguien puso toda una DataGridView en una célula - mirado raro.

Existen también otras columnas previstas:

DataGridViewButtonColumn 
DataGridViewCheckBoxColumn 
DataGridViewComboBoxColumn 
DataGridViewImageColumn 
DataGridViewLinkColumn 
DataGridViewTextBoxColumn 

puede cambiar estos en el editor de la columna en el diseñador de Visual Studio, o añadirlos en código para la colección de columnas.

+0

Ah , ¿entonces estás diciendo que puedo agregar CUALQUIER tipo de control en un DataGridViewButtonColumn? Cuando me encontré con esto, pensé que era una columna llena de botones ;-) – Boris

+0

@Boris No, no en la columna Botón, puede crear un tipo de columna que aloje cualquier control y agregar ese tipo de columna a la cuadrícula. Por ejemplo, puede hacer que DataGridViewNumericUpDownColumn aloje un control NumericUpDown. La columna está codificada para alojar un tipo de control particular, no es una decisión de tiempo de ejecución. –

+0

Pero creo que todavía hay un malentendido: con este enfoque, ¿toda la columna obtiene el mismo tipo de control? Porque lo que me gustaría tener es un tipo diferente de control en cada célula. – Boris

-1

me gustaría añadir que en el diseñador y hacer un campo de la plantilla. Una forma sencilla de ir y poner lo que quieras en el DataGridView

Ejemplo

<asp:DataGrid ID="somedatagrid" runat="server"> 
    <Columns> 
     <asp:TemplateColumn> 
      <ItemTemplate> 
       <asp:Button ID="somebutton" runat="server" Text="some button" /> 
      </ItemTemplate> 
     </asp:TemplateColumn> 
    </Columns> 
</asp:DataGrid> 
+0

Desafortunadamente la pregunta era sobre winforms, no sobre páginas .NET. – Zorgarath

Cuestiones relacionadas