C# 如何为自动生成的列设置DataGridView列属性?

C# 如何为自动生成的列设置DataGridView列属性?,c#,winforms,visual-studio-2008,datagridview,C#,Winforms,Visual Studio 2008,Datagridview,我编辑绑定到DataGridView的DataTable中的数据。在数据表中创建新列时,视图中将生成一个新列 通常我会在DataGridView\u ColumnAdded事件中设置视图列属性,但是,当前列的默认设置是添加一个视图列,该视图列的SortMode设置为Automatic,它与DataGridViewColumnHeaderSelect属性不兼容,并在触发列添加事件之前导致错误 我想我是通过为新生成的列定义一个“模板”列来解决这个问题的——但是如何解决呢?有趣的是,我用DataGri

我编辑绑定到
DataGridView
DataTable
中的数据。在
数据表中创建新列时,视图中将生成一个新列

通常我会在
DataGridView\u ColumnAdded
事件中设置视图列属性,但是,当前列的默认设置是添加一个视图列,该视图列的
SortMode
设置为
Automatic
,它与
DataGridView
ColumnHeaderSelect
属性不兼容,并在触发列添加事件之前导致错误


我想我是通过为新生成的列定义一个“模板”列来解决这个问题的——但是如何解决呢?

有趣的是,我用
DataGridView
做了很多工作,但我还没有看到这一点。也许务实的选择是手动构建列?可能不是你想听的…

好了,该破解了:

为了演示,这里有一个小应用程序:

 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。单击按钮1,我向datatable添加内容,然后将其绑定到DataGridView。诀窍是,在绑定DGV之前和之后调用一个名为FlipSelectionMode()的方法。它的作用是,如果它处于columnheaderselect模式,它会将其翻转到cell select,反之亦然。这样可以添加列。然后,在column added事件中,我将columns sort属性设置为Programminal,否则,您将无法添加其他列。为了演示这一点,在按钮2上单击,它只是添加了另一列,同时在前后翻转选择模式


我同意,这是一个完全的黑客,但DGV是时髦的。我在这方面遇到了很多问题,而且我几乎总是要修改一些东西。

你说的手动是什么意思?是在设计器中还是以编程方式?我尽量不使用设计器,因为我反映的数据用于任意大小的双精度数据集,因此列的数量会发生很大变化。