为什么没有从DataGridView中删除DataGridColumn

本文关键字:删除 DataGridColumn DataGridView 为什么 | 更新日期: 2023-09-27 18:28:25

我有自定义的DataGridView控件,在该控件中有RefreshGrid()方法,它使用DataSource填充DataGridView。现在,我正在字符串中从DataSource绑定后的DataGridView中删除一些列,但无法删除这些列,这些列没有被删除,而是在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();
    }

请找出错误并向我建议解决方案。

为什么没有从DataGridView中删除DataGridColumn

我找到了这个问题的答案

我需要在Form Load上调用RefreshGrid()方法,而不是在Form上构造函数,在Form Log上调用它之后,我的问题得到了解决。但是我不知道为什么它不适用于Form构造函数。

我猜您试图访问尚不存在的列。您使用的是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 中删除任何列

我找到了这个问题的答案

我需要在Form Load上调用RefreshGrid()方法,而不是在Form构造函数上,在Form Load调用它之后,我的问题就解决了。但我不知道为什么它不适用于Form构造函数。