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

时间:2009-02-06 16:12:17

标签: c# winforms visual-studio-2008 datagridview

我在绑定到DataTable的{​​{1}}中编辑数据。在DataGridView中创建新列时,将在视图中生成新列。

通常我会在DataTable事件中设置视图列属性,但是目前列的默认设置是添加一个DataGridView_ColumnAdded设置为SortMode且不兼容的视图列使用Automatic DataGridView属性并在添加的列事件可以触发之前导致错误。

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

2 个答案:

答案 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完成了很多工作,但我还没有看到这个。也许实用的选项可能是手动构建列?可能不是你想听的......