我见过How to: Host Controls in Windows Forms DataGridView Cells,它解释了如何托管用于编辑DataGridView中单元格的控件。但是如何托管显示单元格的控件呢?
我需要在同一个单元格中显示文件名和按钮。我们的UI设计师是一个平面设计师,而不是程序员,因此我必须将代码与他所绘制的内容相匹配,无论是否可行 - 或明智 - 或不是。我们正在使用VS2008并使用C#编写.NET 3.5,如果这有所不同。
更新:'net建议创建一个自定义DataGridViewCell,作为第一步托管面板;有人这样做过吗?
答案 0 :(得分:3)
根据您的“更新”,创建自定义DataGridViewCell
就是这样做的方式。我已经完成了它,并且它不需要从MSDN提供的示例代码进行太多修改。就我而言,我需要一堆自定义编辑控件,因此我最终继承自DataGridViewTextBoxCell
和DataGridViewColumn
。我插入了我的类(从DataGridViewTextBoxCell
继承的那个)一个新的自定义控件,它实现了IDataGridViewEditingControl
,而且一切正常。
我认为在您的情况下,您可以编写一个PanelDataGridViewCell
,其中包含一个控件MyPanelControl
,该控件将从Panel继承并实现IDataGridViewEditingControl
。
答案 1 :(得分:2)
不是使用datagridview,而是使用TableLayoutPanel。创建具有标签和按钮以及事件的控件,并使用它们填充布局面板。你可以说你的控制成了细胞。如果这是您想要的布局样式,那么使表格布局面板看起来像数据网格视图并不需要太多。
答案 2 :(得分:1)
有两种方法可以做到这一点:
1)。将DataGridViewCell转换为存在的某个单元格类型。例如,将DataGridViewTextBoxCell转换为DataGridViewComboBoxCell类型。
2)。创建一个控件并将其添加到DataGridView的控件集合中,设置其位置和大小以适合要作为主机的单元格。
请参阅下面的Zhi-Xin Ye的示例代码,其中说明了这些技巧:
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;
}
MSDN Reference : how to host different controls in the same column in DataGridView control
使用第一种方法如下所示:
使用第二种方法如下所示:
其他信息:Controls in the same DataGridView column dont render while initializing grid