2013-08-21 2 views
1

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

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(); 
    } 

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

+0

** Теперь я пытаюсь удалить несколько столбцов из этого DataGridView после привязки DataSource ** ??? Пожалуйста, покажите нам код, в котором вы удаляете эти столбцы после привязки DataSource. –

+0

Код работает нормально, вы всегда можете удалить столбцы datagridview после привязки. –

+0

@MicrosoftDN 'this.Columns.Remove (colm);' –

ответ

3

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

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

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

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

0

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

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

this.DataSource = results; 

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

+0

Это удаляет/фильтрует строки, а не столбцы? –

+0

@KingKing: из выражения select в linq мы получаем только столбцы, которые нам нужны. где cond может быть удален. если не требуется –

+0

Я упустил «Выбрать», однако для этого все еще нужен «CopyToDataTable», если OP хочет, чтобы его DataSource был «DataTable». Я думаю, мы должны использовать 'Anonymous type 'здесь, чтобы выбрать столбцы, поэтому' CopyToDataTable' не может быть использован. –

0

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

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

Смежные вопросы