首页 > 解决方案 > dataGridView BindingContextChanged 事件不与 dataGridView 数据源更改同步,Winform

问题描述

我遇到了 dataGridViewBindingContextChanged事件触发的问题。我在表单中有 2 个 datagridview,并为两个网格实现了 BindingContextChanged 事件。

在 BindGrid 方法上,grid1 首先与数据源绑定,但 grid2 的 BindingContextChanged 事件首先触发,然后是 grid1,然后在 grid2 与其他数据源绑定后,grid2 BindingContextChanged 事件不会触发。我不知道为什么会发生这种情况,我需要每个 BindingContextChanged 事件应该在各自的网格数据源分配之后触发。请帮我解决这个问题。

下面是示例代码

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.dataGridView1.BindingContextChanged += new System.EventHandler(this.dataGridView1_BindingContextChanged);
        this.dataGridView2.BindingContextChanged += new System.EventHandler(this.dataGridView2_BindingContextChanged);
    }

    private void btnBind_Click(object sender, EventArgs e)
    {
        BindGrid();
    }

    protected void BindGrid()
    {
        DataTable dt1 = new DataTable();
        dt1.Columns.Add("ID", typeof(int));
        dt1.Rows.Add(1);
        dt1.Rows.Add(2);
        dt1.Rows.Add(3);
        BindingSource dataSource = new BindingSource(dt1, null);
        dataGridView1.DataSource = dataSource;

        DataTable dt = new DataTable();
        dt.Columns.Add("ID", typeof(int));
        dt.Rows.Add(1);
        dt.Rows.Add(2);
        dt.Rows.Add(3);

        BindingSource dataSource1 = new BindingSource(dt, null);
        dataGridView2.DataSource = dataSource1;
       
    }

    private void dataGridView1_BindingContextChanged(object sender, EventArgs e)
    {
        // Continue only if the data source has been set.
        if (dataGridView1.DataSource == null)
        {
            return;
        }
    }

    private void dataGridView2_BindingContextChanged(object sender, EventArgs e)
    {
        // Continue only if the data source has been set.
        if (dataGridView2.DataSource == null)
        {
            return;
        }

    }

   
}

标签: c#.netwinformsdatagridview

解决方案


我能够重现这个问题。我从BindingContextChanged事件处理程序更改为DataSourceChanged,这解决了这个问题。例如

this.dataGridView1.BindingContextChanged += new System.EventHandler(this.dataGridView1_BindingContextChanged);
this.dataGridView2.BindingContextChanged += new System.EventHandler(this.dataGridView2_BindingContextChanged);

至...

this.dataGridView1.DataSourceChanged += new System.EventHandler(this.dataGridView1_DataSourceChanged);
this.dataGridView2.DataSourceChanged += new System.EventHandler(this.dataGridView2_DataSourceChanged);

当事件触发时, nowdataGridView1.DataSource不为空,并且每个都根据修改后的绑定源触发。


推荐阅读