Как установить свойства столбца DataGridView для автоматически генерируемых столбцов? - PullRequest
0 голосов
/ 06 февраля 2009

Я редактирую данные в DataTable, который связан с DataGridView. При создании нового столбца в DataTable в представлении создается новый столбец.

Обычно я устанавливаю свойства столбца представления в событии DataGridView_ColumnAdded, однако по умолчанию для столбцов в настоящее время добавляется столбец представления с SortMode, установленным на Automatic, что несовместимо с DataGridView ColumnHeaderSelect свойство и вызывает ошибку до того, как событие добавленного столбца может сработать.

Полагаю, я обхожу это путем определения столбца 'template' для вновь создаваемых столбцов - но как?

Ответы [ 2 ]

1 голос
/ 06 февраля 2009

ОК, время взломать:

Чтобы продемонстрировать, вот небольшое приложение:

 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 я добавляю материал в таблицу данных, а затем связываю его с DataGridView. Хитрость в том, что я вызываю метод с именем FlipSelectionMode () до и после привязки DGV. Что это делает, если он находится в режиме выбора заголовка столбца, он переворачивает его на выбор ячейки и наоборот. Это позволяет добавить столбец. Затем в событии добавления столбца я установил свойство сортировки столбцов на Programmatic, в противном случае вы не сможете добавить другой столбец. Чтобы продемонстрировать, что при нажатии кнопки 2 он просто добавляет еще один столбец, снова переключая режим выбора до и после.

Я согласен, это полный взлом, но DGV - фанк. У меня было много проблем, и мне почти всегда приходилось разбираться с вещами.

0 голосов
/ 06 февраля 2009

Интересно - я много сделал с DataGridView и не видел этого. Возможно, прагматичным вариантом может быть создание столбцов вручную? Наверное, не то, что вы хотите услышать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...