example - datagridview databind c#
¿cómo puedo alojar un control en un DataGridViewCell para mostrar y editar? (3)
He visto cómo: Controles de host en Windows Forms DataGridView Cells que explica cómo alojar un control para editar una celda en un DataGridView. Pero, ¿cómo puedo alojar un control para mostrar una celda?
Necesito mostrar un nombre de archivo y un botón en la misma celda. Nuestro diseñador de interfaz de usuario es un diseñador gráfico, no un programador, por lo que tengo que hacer coincidir el código con lo que ha dibujado, ya sea que sea posible, o sabio, o no. Estamos usando VS2008 y escribiendo en C # para .NET 3.5, si eso hace la diferencia.
ACTUALIZACIÓN: la red sugiere crear una DataGridViewCell personalizada que aloja un panel como primer paso; alguien hecho eso?
Según su "ACTUALIZACIÓN", la creación de una DataGridViewCell
personalizada es la forma en que esto se hace. Lo he hecho, y no requiere mucha modificación del código de ejemplo disponible en MSDN. En mi caso, necesitaba un montón de controles de edición personalizados, así que terminé heredando de DataGridViewTextBoxCell
y DataGridViewColumn
. Inserté en mi clase (la heredada de DataGridViewTextBoxCell
) un nuevo control personalizado que implementó IDataGridViewEditingControl
, y todo funcionó.
Supongo que en su caso, podría escribir un PanelDataGridViewCell
que contendría un control MyPanelControl
que heredaría del Panel e implementaría IDataGridViewEditingControl
.
En lugar de utilizar una vista de cuadrícula de datos, ¿qué hay de usar un TableLayoutPanel en su lugar. Crea tu control que tenga una etiqueta y un botón y eventos, y llena tu panel de diseño con ellos. Tu control se convierte en la célula, por así decirlo. No hace falta mucho para que el panel de diseño de la tabla parezca una vista de cuadrícula de datos, si ese es el estilo de diseño que desea.
Hay dos maneras de hacer esto:
1). Emite un DataGridViewCell a un cierto tipo de celda que existe. Por ejemplo, convierta un DataGridViewTextBoxCell al tipo DataGridViewComboBoxCell.
2). Cree un control y agréguelo a la colección de controles de DataGridView, establezca su ubicación y tamaño para que se ajuste a la celda que será el host.
Vea el código de muestra de Zhi-Xin Ye a continuación que ilustra los trucos:
private void Form_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;
}
Referencia de MSDN: cómo alojar diferentes controles en la misma columna en el control DataGridView
El uso del primer método se ve así:
El uso del segundo método se ve así:
Información adicional: los controles en la misma columna DataGridView no se renderizan al inicializar la grilla