我正在尝试显示一个链接到DataTable的简单DataGridView,我最终希望DataTable中的第一列成为DataGridView的行标题单元格。在这一点上,我将决定在行标题单元格中有任何值。我可以显示DataGridView包含我的所有行和列,以及列标题单元格,但没有行标题单元格。我检查了row.HeaderCell.Value中的值,我放在那里的数据就在那里。我检查row.HeaderCell.Displayed并且它是false,但这是只读的,所以我不能使它成为现实。如何显示行标题单元格?
以下是我试图让其发挥作用的简单示例:
DataTable table = new DataTable();
for (int i = 0; i<10; i++)
{
table.Columns.Add(new DataColumn("column-" + i));
}
for (int i = 0; i < 10; i++)
{
DataRow theRow = table.NewRow();
for (int j = 0; j < 10; j++)
theRow[j] = i + "-" + j;
table.Rows.Add(theRow);
}
dataGridView1.DataSource = table;
dataGridView1.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
int rowNumber = 1;
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.IsNewRow) continue;
row.HeaderCell.Value = "Row " + rowNumber;
rowNumber = rowNumber + 1;
}
dataGridView1.AutoResizeRowHeadersWidth(
DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
答案 0 :(得分:9)
如果将此代码放在构造函数中,它将无法正常工作。将代码移动到表单的Load
事件中,它应该可以正常工作。 Windows.Forms和C#的一个常见问题是在构造函数中使用了不正确的初始化。在构造函数完成之后,才会完全创建许多控件。 (我忘记了原因,但我认为这是因为尚未创建句柄。)如果您按照Microsoft推荐的Load
事件进行初始化,则可以避免许多“解决方法”。
答案 1 :(得分:5)
只需调用ToString(),如下所示
row.HeaderCell.Value = ("Row " + rowNumber).ToString();
答案 2 :(得分:2)
尝试使用DataGridView.RowHeadersVisible属性。
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rowheadersvisible.aspx
答案 3 :(得分:1)
答案似乎是处理DataGridView.CellFormatting事件。为什么在其他地方设置价值不起作用超出了我,但我确信这是有原因的。我添加了以下事件处理程序,一切都很好:
private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
DataGridView gridView = sender as DataGridView;
if (null != gridView)
{
gridView.Rows[e.RowIndex].HeaderCell.Value = gridView.Rows[e.RowIndex].Cells[0].Value;
Console.WriteLine("GridViewCell: " + gridView.Rows[e.RowIndex].Cells[0].Value);
}
}
答案 4 :(得分:1)
通过绑定或手动将值分配给datagridview后,我执行了以下操作:
foreach (DataGridViewRow row in dgvValues.Rows)
{
row.HeaderCell.Value = (row.Index+1).ToString();
}
它对我有用。我认为在Linq中应该有一些更简单的解决方法。
答案 5 :(得分:1)
我使用了Karl的答案,但是将事件处理程序更改为RowsAdded,假设行标题名称在创建行后没有更改。 CellFormatting的问题在于每个列都会调用它,所以浪费了一些时间反复设置HeaderCell.Value。
private void dataGridViewVersions_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
DataGridView gridView = sender as DataGridView;
MyData vr = gridView.Rows[e.RowIndex].DataBoundItem as MyData ;
if (vr != null)
{
gridView.Rows[e.RowIndex].HeaderCell.Value = vr.RowName.ToString();
}
}