Почему 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() при загрузке формы, а не в конструкторе формы, после вызова его при загрузке формы моя проблема решена. Но я не знаю, почему он не работал над конструктором форм.