Почему DataGridColumn не удаляется из DataGridView

У меня есть обычай DataGridView контроль и в этом контроле есть RefreshGrid() метод, который заполняет DataGridView используя DataSource. Теперь я пытаюсь удалить несколько столбцов из этого DataGridView после привязки DataSource, но не удается удалить их, эти столбцы не удаляются, а добавляются в конце DataGridView, когда я вызываю RefreshGrid() Метод снова, то эти столбцы удаляются из DataGridView, Вот код для метода RefreshGrid()

    public void RefreshGrid()
    {
        DataTable _table = AccessConnectionManagers.GetDataTableBySQLQuery("select Colm1,Colm2,Colm3 from TableName");
        //Data Source Binding with DataGridView
        this.DataSource = _table;

        if (!string.IsNullOrEmpty("Colm1"))
        {
            var _colmArray = GridRemoveColumnName.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries).Where(a => this.Columns.Contains(a)).Select(a => a).ToArray();

            foreach (string colm in _colmArray)
            {
                //Remove column after Source Binding
                this.Columns.Remove(colm);
            }
        }
    }

Звать RefreshGrid()

    public Form1()
    {
        InitializeComponent();
        myDataGridView1.RefreshGrid();
    }

Пожалуйста, найдите ошибку и предложите мне решение.

3 ответа

Решение

Я нашел ответ на этот вопрос

Мне нужно вызвать метод RefreshGrid() при загрузке формы, а не в конструкторе формы, после вызова в журнале форм моя проблема решена. Но я не знаю, почему он не работал над конструктором форм.

Я думаю, вы пытаетесь получить доступ к столбцам, которые еще не существуют. Вы используете DataGridView.AutoGenerateColumns функциональность и даже если вы установите DataSource собственность DatagridView не будет создавать столбцы, пока не отобразится сетка. Вот почему он не работает в конструкторе форм, но работает в form_Load событие или после этого сетка была отображена.

С помощью form_Load возможно, это обходной путь, но я рекомендую вам использовать DataGridView.DataBindingComplete событие, которое специально разработано, чтобы справиться с этой ситуацией.

Вы должны извлечь только столбцы из таблицы данных, которые вы хотите отобразить в DataGridView.

var results = _table
    .AsEnumerable()
    .Where("Add your condition")
    .Select("your columns names");

this.DataSource = results;

Так что теперь вам не нужно удалять какие-либо столбцы из DataGridView

Я нашел ответ на этот вопрос

Мне нужно вызвать метод RefreshGrid() при загрузке формы, а не в конструкторе формы, после вызова его при загрузке формы моя проблема решена. Но я не знаю, почему он не работал над конструктором форм.

Другие вопросы по тегам