C# 如何绕过DataGridView_DataBindingComplete事件

本文关键字:DataBindingComplete 事件 DataGridView 何绕过 | 更新日期: 2023-09-27 18:31:10

我目前的情况如下:我有 3 个数据网格视图,我可以过滤它们(通过 bindingsource.filter),还可以从一个数据网格视图中移动列。执行此操作的代码:

//Move from third datagrid to first
private void moveToFirstGridToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        dataGridView3.Columns[currentColumnIndex].Visible = false;
        dataGridView1.Columns[currentColumnIndex].Visible = true;
        currentColumnIndex = -5;
    }

这是有效的,因为所有三个数据网格都具有与数据源相同的数据表,具有此表的所有列,并且我只需随时控制显示的内容。 这 3 个数据网格视图,每个视图都有一个单独的绑定源。但是,所有三个绑定源都从同一数据表中获取数据。我还使用以下逻辑控制用户看到的内容:在第一个网格上显示 10 个前列,在第二个网格上显示接下来的 10 列,在第三个网格上显示接下来的 10 列。

我有一个小问题,每当第一个数据网格中只有列时,数据表的第一列也会显示在第二个和第三个数据网格上,这是我不想要的。通过这个问题:DataGridView 显示设置为不可见的列 通过该答案,我能够处理 databindingcomplete 事件。这是我当前的处理程序,适用于所有 3 个数据网格:

private void DataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
DataGridView view = sender as DataGridView; 
        bool anyVisible = false;
        int max = 0, min = 0;
        if (view == this.dataGridView1)
        {
            min = 0;
            max = 10;
        }
        if (view == this.dataGridView2)
        {
            min = 10;
            max = 20;
        }
        if (view == this.dataGridView3)
        {
            min = 20;
            max = 30;
        }
        for (int i = 0; i < this.m_CurrentTable.Columns.Count; i++)
        {
            view.Columns[i].Visible = i >= min && i < max;
            anyVisible = anyVisible || view.Columns[i].Visible;
        }
        view.RowHeadersVisible = anyVisible;
        view.ScrollBars = anyVisible ? ScrollBars.Both : ScrollBars.None;
}

来解决问题:例如,如果我将一列从数据网格 3 移动到数据网格 1,然后尝试过滤,我希望它能像人们期望的那样工作。此代码将不允许您这样做,因为例如,如果我将列 #21(第三个数据网格)移动到第一个,然后进行过滤,当为每个数据网格触发一次 databindingcomplete 事件时,列 #21 将移回第三个数据网格。过滤工作正常,但列的位置被重置,这是我不想要的。

基本上,我的过滤器指定要显示哪些行,以及数据绑定完成事件要显示哪些列。我可以只实现一个布尔值来检查是否有过滤器,然后避免此事件,但这不是一个很好的解决方案,还会导致其他问题。

我正在考虑的一种方法是,也许我可以尝试在 databindingcomplete 事件中将绑定源数据源重置为当前 datagrid 数据源(当您将列移动到其中时已更改)。不过,我仍在尝试看看这是否有意义。另一件可能也可以使用的东西是 datagridviewbindingcomplete 事件参数的 e.listchangedtype,但我没有经验。

这显然是一个专门的问题,但它的部分(数据网格视图、事件处理)更基本。欢迎任何回答的尝试。

C# 如何绕过DataGridView_DataBindingComplete事件

您需要维护哪个列属于哪个数据网格视图的逻辑映射,并在网格之间移动列时相应地更新它,而不是阻止事件。

例如,像这样的东西

private int[] columnViewIndex = Enumerable.Repeat(0, 10)
    .Concat(Enumerable.Repeat(1, 10))
    .Concat(Enumerable.Repeat(2, 10))
    .ToArray();
private void moveToFirstGridToolStripMenuItem1_Click(object sender, EventArgs e)
{
    dataGridView3.Columns[currentColumnIndex].Visible = false;
    dataGridView1.Columns[currentColumnIndex].Visible = true;
    columnViewIndex[currentColumnIndex] = 0; // 1, 2 in other move methods
    currentColumnIndex = -5;
}
private void DataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    var view = sender as DataGridView;
    int viewIndex = view == this.dataGridView1 ? 0 : view == this.dataGridView2 ? 1 : 2;
    bool anyVisible = false;
    for (int i = 0; i < this.m_CurrentTable.Columns.Count; i++)
    {
        bool visible = i < columnViewIndex.Length && columnViewIndex[i] == viewIndex;
        view.Columns[i].Visible = visible;
        anyVisible = anyVisible || visible;
    }
    view.RowHeadersVisible = anyVisible;
    view.ScrollBars = anyVisible ? ScrollBars.Both : ScrollBars.None;
}
相关文章:
  • 没有找到相关文章