我在绑定到DataTable
的{{1}}中编辑数据。在DataGridView
中创建新列时,将在视图中生成新列。
通常我会在DataTable
事件中设置视图列属性,但是目前列的默认设置是添加一个DataGridView_ColumnAdded
设置为SortMode
且不兼容的视图列使用Automatic
DataGridView
属性并在添加的列事件可以触发之前导致错误。
我认为我通过为新生成的列定义“模板”列来解决这个问题 - 但是如何?
答案 0 :(得分:1)
好的,是时候破解它了:
为了演示,这里有一个小应用程序:
public partial class Form1 : Form
{
DataTable table = new DataTable();
public Form1()
{
InitializeComponent();
this.dataGridView1.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
this.dataGridView1.ColumnAdded += new DataGridViewColumnEventHandler(dataGridView1_ColumnAdded);
}
void dataGridView1_ColumnAdded(object sender, DataGridViewColumnEventArgs e)
{
Console.WriteLine("Column added");
e.Column.SortMode = DataGridViewColumnSortMode.NotSortable;
}
private void button1_Click(object sender, EventArgs e)
{
table.Columns.Add("Name");
table.Columns.Add("Age", typeof(int));
table.Rows.Add("John", 27);
this.FlipSelectionMode();
this.dataGridView1.DataSource = table;
this.FlipSelectionMode();
}
private void button2_Click(object sender, EventArgs e)
{
this.FlipSelectionMode();
table.Columns.Add("Height",typeof(int));
table.Rows[0]["Height"] = 60;
this.FlipSelectionMode();
}
private void FlipSelectionMode()
{
this.dataGridView1.SelectionMode = this.dataGridView1.SelectionMode == DataGridViewSelectionMode.ColumnHeaderSelect ? DataGridViewSelectionMode.CellSelect : DataGridViewSelectionMode.ColumnHeaderSelect;
}
}
基本上,我首先将DataGridView选择模式设置为ColumnHeaderSelect。在button1上单击,我将数据添加到数据表中,然后将其绑定到DataGridView。诀窍是,我在绑定DGV之前和之后调用了一个名为FlipSelectionMode()的方法。这样做,如果它处于columnheaderselect模式,它将其翻转为单元格选择,反之亦然。这样就可以添加列。然后,在列添加事件中,我将列排序属性设置为Programmatic,否则,您将无法添加其他列。为了证明这一点,在按钮2上单击时,它只是在翻转选择模式之前和之后再添加另一列。
我同意,这完全是黑客,但DGV很时髦。我有很多问题,而且我几乎总是不得不破解它们。
答案 1 :(得分:0)
有趣 - 我用DataGridView
完成了很多工作,但我还没有看到这个。也许实用的选项可能是手动构建列?可能不是你想听的......